【问题标题】:Modify column of a data.table based on another column and add the new column根据另一列修改data.table的列并添加新列
【发布时间】:2014-04-02 01:47:04
【问题描述】:

我有一个 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

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

   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.tableq 现在有两列同名,V1

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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    使用

    创建一个
    DT[,list(V2=V2, V3=V2/sum(V2)), by='V1']
    

    (修改行顺序)或修改 data.table 使用赋值运算符:

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

    注意现在行顺序是一样的。

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

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

    【讨论】:

    • 首先感谢您的回答!这至少可以正确附加计算。如果可以,为什么这行得通?一个小问题是行的顺序错误。我想我可以通过附加一个带有行号的新列并对其进行排序来解决后一个问题。但是,有没有“一步到位”的解决方案?
    • 请看编辑:分组需要排序才能有效。
    猜你喜欢
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多