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

标签 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 .

几天来我一直在这个问题上敲我的头,搜索了高低,仍然无法想出一个简单的答案。任何帮助将非常感激。

最佳答案

使用创建一个新表

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

(修改行顺序)或修改 data.table使用赋值运算符就位:
DT[, V3 := V2/sum(V2), by='V1'] 

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

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

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

关于r - 根据另一列修改data.table的列并添加新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22788113/

相关文章:

css - 在 R Shiny 中更改侧边栏菜单项颜色

r - R 中稀疏矩阵的 SVD

r - 在 R 中将列名称绘制为 x 轴

rbindlist data.tables 具有不同列数

r - data.table 按行求和,平均值,最小值,最大值,如 dplyr?

r - 带中断的增量序列

r - 将所有缺失行插入数据表中,以获得 2 列的一系列值

r - 用 knitr 垂直堆叠的子图

r - R中有没有办法告诉某个纬度/经度坐标属于哪个大陆?

R:如何读取带有 data.table::fread 的 CSV 文件,其中逗号为小数,点为千位分隔符 ="."