示例数据:
set.seed(1)
dt <- data.table(a = sample(c("a", "b"), 25, replace = T), b = sample(c("c", "d"), 25, replace = T), c = runif(25))
nodes <- c("a", "b")
metric <- "c"
想法是将分组列作为动态变量。 <{1}}中传递给by
参数的列名计数未知。
预期输出(通过在函数中使用固定名称):
data.table
转到dt[,.(Count = .N, Avg = mean(get(metric))),.(a,b)]
a b Count Avg
1: a c 4 0.5622371
2: b c 7 0.4535460
3: b d 6 0.5033865
4: a d 8 0.3872618
函数只返回节点对象中的第一个参数:
get()
可以dt[,.(Count = .N, Avg = mean(get(metric))),.(get(nodes))]
get Count Avg
1: a 12 0.4455869
2: b 13 0.4765493
逐个命名并获得正确的结果:
get
但正如我所陈述的那样 - 事先并不知道这些变量的数量。
答案 0 :(得分:2)
我们可以仅使用nodes
指定分组变量,并使用列来指定.SDcols
dt[, .(Count = .N, Avg = mean(.SD[[1]])), by = nodes, .SDcols = metric]
# a b Count Avg
#1: a c 4 0.5622371
#2: b c 7 0.4535460
#3: b d 6 0.5033865
#4: a d 8 0.3872618