gpt4 book ai didi

r - data.table: lapply 一个具有多列输出的函数

转载 作者:行者123 更新时间:2023-12-04 17:44:07 25 4
gpt4 key购买 nike

我正在使用一个函数 smean.cl.normal来自 Hmisc 包,它返回一个具有 3 个值的向量:均值和上下 CI。当我在 data.table 上使用它时有 2 个组,我获得 2 列和 6 行。有没有办法获得与 2 组相对应的两行和每个函数输出的单独列的结果,即均值和 CI?

require(Hmisc)
require(data.table)

dt = data.table(x = rnorm(100),
gr = rep(c('A', 'B'), each = 50))

dt[, lapply(.SD, smean.cl.normal), by = gr, .SDcols = "x"]

输出:
   gr           x
1: A -0.07916335
2: A -0.33656667
3: A 0.17823998
4: B -0.02745333
5: B -0.32950607
6: B 0.27459941

所需的输出:
   gr        Mean         Lower         Upper
1: A -0.07916335 -0.33656667 0.17823998
2: B -0.02745333 -0.32950607 0.27459941

最佳答案

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)也应该工作。

注释

由于几个原因,这非常低效。开启 verbose=TRUE查看 data.table 不喜欢在 j 中获取命名列表:

The result of j is a named list. It's very inefficient to create the same names over and over again for each group. When j=list(...), any names are detected, removed and put back after grouping has completed, for efficiency. Using j=transform(), for example, prevents that speedup (consider changing to :=). This message may be upgraded to warning in future.



此外,您错过了 mean 的组优化版本。和其他可能用于构建结果的函数。不过,这对您的用例来说可能不是什么大问题。

当您仅将其应用于单个值列时,只需:
dt[, as.list(smean.cl.normal(x)), by = gr]

就足够了。

关于r - data.table: lapply 一个具有多列输出的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42163675/

25 4 0