【问题标题】:Vectorized alternative for finding sum against each match用于针对每个匹配查找总和的矢量化替代方案
【发布时间】:2013-10-10 05:32:39
【问题描述】:

有人可以建议以下代码的矢量化替代方案吗:

x=read.table("1.txt")
y=read.table("unique.txt")
nrowx=nrow(x)
nrowy=nrow(y)
for(i in 1:nrowy)
    {
        y[i,3]=0
        for(j in i:nrowx)            
        {
            if((y[i,1]==x[j,1])&(y[i,2]==x[j,2]))
            {
                y[i,3] = (y[i,3] + x[j,3])
            }
        }
    }

文件 y 包含 x 的唯一元素(考虑到第一 2 列)。对于 y 中的每个条目,所有可能的匹配项都在 x 中找到,并且 x 的第 3 列中相应值的总和存储在 y 的第 3 列中。这是针对 y 的每一行完成的。

在 x 中读取了几行文件:

"X1" "X2" "X3"
"1" 4 10 -1440
"2" 4 10 -3765
"3" 10 22 523
"4" 10 295 730
"5" 10 295 1599
"6" 10 584 1872
"7" 10 403 1872
"8" 10 403 1872
"9" 10 281 554
"10" 10 123 554

y 中读取的文件几行:

"X1" "X2" "X3" 
"1" 4 10 NA 
"3" 10 22 NA 
"4" 10 295 NA 
"6" 10 584 NA 
"7" 10 403 NA 
"9" 10 281 NA 
"10" 10 123 NA 

预期输出:

X1  X2    X3
1  4  10 -5205
2 10  22   523
3 10 123   554
4 10 281   554
5 10 295  2329
6 10 403  3744
7 10 584  1872

文件非常大,这些循环需要很长时间。欢迎一些不涉及循环的替代方案。 谢谢!

【问题讨论】:

  • 请描述您的预期输出。
  • 我已经相应地编辑了我的问题。
  • 没有。您确实没有描述了预期的输出。目前还不清楚您是要匹配行名还是行号。

标签: r loops vectorization


【解决方案1】:

看来aggregate 函数在这里很有用:

aggregate(x, list(x$X1, x$X2), sum) -> a
data.frame(X1=a$Group.1, X2=a$Group.2, X3=a$X3)
  X1  X2    X3
1  4  10 -5205
2 10  22   523
3 10 123   554
4 10 281   554
5 10 295  2329
6 10 403  3744
7 10 584  1872

这样更快吗?告诉我。

【讨论】:

  • 绝对快得多!谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-09-28
  • 2021-12-11
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多