The j
论证中DT[i,j,by]
需要一个列表,所以使用as.list
:
dt[,
Reduce(c, lapply(.SD, function(x) as.list(smean.cl.normal(x))))
, by = gr, .SDcols = "x"]
# gr Mean Lower Upper
# 1: A 0.1032966 -0.1899466 0.3965398
# 2: B -0.1437617 -0.4261330 0.1386096
c(L1, L2, L3)
是列表的组合方式,所以Reduce(c, List_o_Lists)
如果你的.SDcols
包含的不仅仅是x
。我猜do.call(c, List_o_Lists)
也应该有效。
Comments
由于几个原因,这是相当低效的。打开verbose=TRUE
看到 data.table 不喜欢获取命名列表j
:
j 的结果是一个命名列表。为每个组一遍又一遍地创建相同的名称是非常低效的。当 j=list(...) 时,为了提高效率,在分组完成后会检测、删除并放回任何名称。例如,使用 j=transform() 可以防止加速(考虑更改为 :=)。此消息将来可能会升级为警告。
此外,您还错过了针对群体优化的版本mean
以及其他可能可用于构建结果的函数。不过,这对于您的用例来说可能不是什么大问题。
当您仅将此应用于单个值列时,只需:
dt[, as.list(smean.cl.normal(x)), by = gr]
就足够了。