我试图根据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
答案 0 :(得分:5)
请参阅GitHub上的data.table
Reference Semantics vignette:
请注意,由于我们允许在没有引用列名的情况下通过引用进行分配,如第2c节中所述只有一列,我们不能执行out_cols:= lapply(.SD,max)。这将导致添加一个名为out_col的新列。相反,我们应该做c(out_cols)或简单(out_cols)。用变量名称包装(足以区分这两种情况。
您需要将适当的列名向量传递给:=
因此,以下内容应该有效(替换原始数据集中的值)
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