如何将data.table各列的均值、标准差转为多列结果表?
解决data.table统计量列结构转换问题
我太懂你这个困扰了——你现在用lapply(.SD, test)得到的是2行3列的结果,每个列对应原数据的一个指标,行是mean和sd,但你想要把这些统计量都拆成单独的列,变成1行6列的data.table对吧?
下面给你几种实用的解决方法:
方法1:用melt+dcast重塑数据(通用型,适合列多的情况)
先保留你原来的计算逻辑,再通过数据重塑得到目标格式:
library(data.table) # 你的原函数和计算 test <- function(x){ c(mean = mean(x), sd = sd(x)) } b <- a[ , lapply(.SD, test)] # 转成长格式,拆分指标和统计类型 b_long <- melt(b, measure.vars = names(b), variable.name = "Metric", value.name = "Value") b_long[, c("Variable", "Stat") := tstrsplit(Metric, "\\.")] # 转成宽格式,得到目标结构 result <- dcast(b_long, . ~ Variable + Stat, value.var = "Value")
方法2:直接转置并设置列名(简洁型)
利用转置操作直接把行转成列,再调整列名:
test <- function(x){ c(mean = mean(x), sd = sd(x)) } b <- a[ , lapply(.SD, test)] # 转置后转成data.table,再调整列名 result <- as.data.table(t(b)) new_colnames <- paste0(rownames(result), ".", colnames(result)) result <- transpose(result)[, setnames(.SD, new_colnames)]
方法3:手动定义输出列(直观型,适合列少的情况)
如果你的列数不多(就这3个),直接在j表达式里逐个定义统计量列,非常直观:
result <- a[, .( Accuracy.mean = mean(Accuracy), Accuracy.sd = sd(Accuracy), Specificity.mean = mean(Specificity), Specificity.sd = sd(Specificity), Sensitivity.mean = mean(Sensitivity), Sensitivity.sd = sd(Sensitivity) )]
为什么原代码会得到两行?
因为你的test函数返回的是长度为2的向量,lapply会把每个列的计算结果作为新的一列,所以最终b是2行(对应mean和sd)、3列(对应原数据的三个指标)的结构。我们需要把这个结构“旋转”一下,把行的统计类型和列的指标名结合,变成单独的列名,就得到你要的1行6列结果啦。
内容的提问来源于stack exchange,提问作者costa_25
相关产品推荐
相关产品推荐

