【问题标题】:Calculate sum of a list of variables by group按组计算变量列表的总和
【发布时间】:2012-11-19 22:43:06
【问题描述】:

我有一个带有一个键和大约 100 个数字行的 data.table,其中一个设置为键。我想创建一个新变量,其中包含每个数字行的总和,按键分组。

例如,我现在的数据是

ID Count1 Count2 Count3
1   1      3      0
1   3      3      3
2   1      2      1
3   1      1      2

我想要的是:

ID Count1 Count2 Count3
1   4      6      3
2   1      2      1
3   1      1      2

我已经尝试了很多方法来获得这个。我知道我能做到:

Y <- X[, list(Count=sum(Count1), Count2=sum(Count2), Count3=sum(Count3), by = ID]

但是,我有数百个变量,我只能在列表中找到它们的名称。我该如何处理?

非常感谢您的帮助。

这是生成测试数据的代码:

ID <-c(rep(210, 9), rep(3917,6))
Count1 <- c(1,1,0,1,3,1,4,1,1,1,1,1,1,0,1)
Count2 <- c(1,0,0,1,0,1,0,1,1,1,1,1,1,0,1)
Count3 <- c(1,0,0,1,0,1,0,1,1,1,1,1,1,0,1)
x <- data.table(ID, Count1, Count2, Count3)
setkey(x, ID)

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您的测试数据与您提供的示例不匹配,但无论如何 - 您可以利用 data.table() 有一个名为 .SD 的“数据子集”运算符的事实。所以这应该有效:

    x[, lapply(.SD, sum), by = ID]
    #----
         ID Count Count2 Count3
    1:  210    13      5      5
    2: 3917     5      5      5
    

    这实际上已在常见问题解答中介绍:输入 vignette("datatable-faq", package="data.table") 或查找 online

    【讨论】:

    • 一定要喜欢学习 R。绝对重视简洁而不是可读性。 当然 SD 表示“数据子集”。在统计分析语言中使用这个缩写可能会出现什么问题? :)
    【解决方案2】:

    由于 data.table 是一个 data.frame,您可以为此使用聚合:

    > aggregate(. ~ ID, data=x, FUN=sum)
        ID Count1 Count2 Count3
    1  210     13      5      5
    2 3917      5      5      5
    

    【讨论】:

    • 但如果你使用的是 data.table 你就不会想要了。
    • 可能不会。 aggregate 需要两倍的时间。
    猜你喜欢
    • 2021-08-03
    • 1970-01-01
    • 2018-09-20
    • 2020-01-02
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    相关资源
    最近更新 更多