用于查找每个匹配的总和的矢量化替代方案

时间:2013-10-10 05:32:39

标签: r loops vectorization

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

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

文件非常大,这些循环花费了很多时间。一些不涉及循环的替代方案是受欢迎的。 谢谢!

1 个答案:

答案 0 :(得分:2)

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

这更快吗?让我知道。