【发布时间】:2014-07-29 02:48:57
【问题描述】:
我正在尝试根据 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
【问题讨论】:
标签: r data.table