7

我正在寻找一种解决方案,用 data.table 按组计算某些变量的加权和。我希望这个例子足够清楚。

require(data.table)

dt <- data.table(matrix(1:200, nrow = 10))
dt[, gr := c(rep(1,5), rep(2,5))]
dt[, w := 2]

# Error: object 'w' not found
dt[, lapply(.SD, function(x) sum(x * w)),
   .SDcols = paste0("V", 1:4)]

# Error: object 'w' not found
dt[, lapply(.SD * w, sum),
   .SDcols = paste0("V", 1:4)]

# This works with out groups
dt[, lapply(.SD, function(x) sum(x * dt$w)),
   .SDcols = paste0("V", 1:4)]

# It does not work by groups
dt[, lapply(.SD, function(x) sum(x * dt$w)),
   .SDcols = paste0("V", 1:4), keyby = gr]

# The result to be expected
dt[, list(V1 = sum(V1 * w),
          V2 = sum(V2 * w),
          V3 = sum(V3 * w),
          V4 = sum(V4 * w)), keyby = gr]

### from Aruns answer
dt[, lapply(.SD[, paste0("V", 1:4), with = F],
            function(x) sum(x*w)), by=gr]
4

1 回答 1

6

最后的尝试(复制罗兰的答案:))

复制@Roland 的优秀答案:

print(dt[, lapply(.SD, function(x, w) sum(x*w), w=w), by=gr][, w := NULL])

仍然不是最有效的:(第二次尝试)

按照@Roland 的评论,对所有列进行操作然后删除不需要的列确实更快(只要操作本身不耗时,这里就是这种情况)。

dt[, {lapply(.SD, function(x) sum(x*w))}, by=gr][, w := NULL][]

出于某种原因,w当我不使用时似乎找不到{}.. 不知道为什么。


旧的(低效的)答案:

(如果组太多,子集可能会很昂贵)

您可以在不使用.SDcols然后将其删除的情况下执行此操作,同时将其提供lapply如下:

dt[, lapply(.SD[, -1, with=FALSE], function(x) sum(x*w)), by=gr]
#    gr V1  V2  V3  V4
# 1:  1 20 120 220 320
# 2:  2 70 170 270 370

.SDcols没有列。.SD _ w因此,不可能乘以,w因为它不存在于 .SD 环境的范围内。

于 2013-07-19T10:33:49.230 回答