根据另一列修改data.table的列并添加新列

时间:2014-04-01 13:57:37

标签: r data.table

我有data.table DT,有两列

   V1 V2
1:  1  3
2:  2  4
3:  3  5
4:  2  2
5:  3  8
6:  1  4
7:  2  5

对于每一行,我想要使用相同V1的所有条目并添加V2条目,然后将V2条目除以该总和并添加第三列。例如,在第1行第3列中,答案应为3 /(3 + 4)。在第2行第3列中,答案应为4 /(4 + 2 + 5)等。

最终我应该

   V1 V2 V3
1:  1  3 0.4285714
2:  2  4 0.3636364
3:  3  5 0.3846154
4:  2  2 0.1818182
5:  3  8 0.6153846
6:  1  4 0.5714286
7:  2  5 0.4545455

我可以通过V3获取q <- DT[,V2/sum(V2),by='V1']但是行的顺序错误

   V1        V1
1:  1 0.4285714
2:  1 0.5714286
3:  2 0.3636364
4:  2 0.1818182
5:  2 0.4545455
6:  3 0.3846154
7:  3 0.6153846

如此简单地将q的第二列粘贴到DT将无法正常工作。另外,data.table q现在有两个名称相同的列V1,有点笨拙。

我几天来一直在讨论这个问题,搜索高低,仍然无法得出一个简单的答案。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

使用

创建
DT[,list(V2=V2, V3=V2/sum(V2)), by='V1']
使用赋值运算符

(使用已修改的行顺序)或修改 data.table

DT[, V3 := V2/sum(V2), by='V1'] 

请注意,现在行顺序是相同的。

RTFM(我询问的问题的一半data.table如果我花了额外的30分钟来阅读it,我可以自己回答!)

至于新表中的行顺序,我认为你不能轻易保存它。 还不清楚为什么你要保留订单,除非有另一个列已经指示它,在这种情况下你可以相应地对新表进行排序。