我有一个带有两列的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

几天来,我一直在努力思考这个问题,经过高空搜寻,仍然找不到简单的答案。任何帮助将非常感激。

最佳答案

使用创建一个新表

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


(具有修改的行顺序)或使用赋值运算符在适当位置修改data.table

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


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

RTFM(我问有关data.table的一半问题,如果我再花30分钟仔细阅读it,我本可以回答自己的!)

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

09-06 08:15
查看更多