用data.table(R)中的ID变量替换它们的总和

时间:2014-07-29 02:48:57

标签: r data.table

我试图根据ID聚合我变量的某个子集。我不想将结果存储为新变量,因为总和将替换旧变量。

我正在寻找一种使用data.table执行此操作的简单方法。

目前,我有一个解决方法,我希望尽可能简化它(即单行):

sum_vars <- c("x1","x2","x4")
tempp <- dt[ , lapply(.SD, sum), by=ID, .SDcols=sum_vars]
dt[ , c(sum_vars) := NULL]
dt <- dt[tempp]
rm(tempp)

我遇到的问题是单线(为了绕过创建临时变量):

tempp是一个与dt不同的大小数据框 - 删除ID之后的所有重复数据。所以这样的事情不起作用:

dt[ , sum_vars] <- dt[ , lapply(.SD, sum), by=ID, .SDcols=sum_vars]

此外,以下内联合并创建新变量.1作为后缀(例如x1.1):

dt <- dt[dt[ , lapply(.SD, sum), by=ID, .SDcols=sum_vars]]

我想要这样的事情,但它没有:

dt[ , .SD:=sum(.SD), by=ID, .SDcols=sum_vars]

但这只会创建一个名为.SD

的变量

最小化数据示例

开始
dt <- structure(list(ID = c(1L, 1L, 2L, 3L), x1 = c(1L, 1L, 1L, 1L), 
                     x2 = c(1L, 2L, 5L, 8L), x3 = c(1L, 3L, 6L, 9L), 
                     x4 = c(1L,  4L, 7L, 2L)), 
                .Names = c("ID", "x1", "x2", "x3", "x4"), 
                class = "data.frame", row.names = c(NA, -4L))
dt
#   ID x1 x2 x3 x4
# 1  1  1  1  1  1
# 2  1  1  2  3  4
# 3  2  1  5  6  7
# 4  3  1  8  9  2

结束
# ID x1 x2 x3 x4
# 1  2   3  4  5
# 1  2   3  4  5
# 2  1   5  6  7
# 3  1   8  9  2

1 个答案:

答案 0 :(得分:5)

请参阅GitHub上的data.table Reference Semantics vignette

  

请注意,由于我们允许在没有引用列名的情况下通过引用进行分配,如第2c节中所述只有一列,我们不能执行out_cols:= lapply(.SD,max)。这将导致添加一个名为out_col的新列。相反,我们应该做c(out_cols)或简单(out_cols)。用变量名称包装(足以区分这两种情况。

您需要将适当的列名向量传递给:=

调用的LHS

因此,以下内容应该有效(替换原始数据集中的值)

dt[,(sum_vars) := lapply(.SD, sum), by = ID, .SDcols = sum_vars]

如果您想保留dt

dt_sum <- copy(dt)[,(sum_vars) := lapply(.SD, sum), by = ID, .SDcols = sum_vars]

请注意,在这两种情况下,我都在sum_var中包装了:=的LHS上的变量名称(())的向量,以强制对其进行评估(而不是简单地创建一个名为sum var

的列