将平均值和标准差应用到数据表的每一列

3

我有一个包含三列的数据表:准确率,特异性和灵敏度。对于每一列,我想计算每一列的平均值和标准差。我希望结果是一个包含六列的数据表(Accuracy.mean,Accuracy.sd,Specificity.mean,Specificity.sd,...)。到目前为止,我做了这个:

test<-function(x){
  c(mean = mean(x),sd = sd(x))
}
b<-a[ ,lapply(.SD, test)]

我每列都得到了两行,该如何解决这个问题?


1
请参考如何创建一个最小化、完整和可验证的实例(Minimal, Complete, and Verifiable example),谢谢。 - jay.sf
尝试 b<-a[ ,unlist(lapply(.SD, test))] - MKR
1个回答

2
你已经很接近了。只需使用unlist替换lapply即可达到目的。
b<-a[ ,unlist(lapply(.SD, test))]
b
#Accuracy.mean Accuracy.sd Specificity.mean Specificity.sd Sensitivity.mean Sensitivity.sd 
# 5.50000       3.02765         16.50000        3.02765      105.50000          3.02765 

使用dplyr非常简单,如下所示:

library(dplyr)
summarise_all(a, .funs = funs(mean, sd))
#Accuracy_mean Specificity_mean Sensitivity_mean Accuracy_sd Specificity_sd Sensitivity_sd
#1           5.5             16.5            105.5     3.02765        3.02765        3.02765

由OP创建的函数

test<-function(x){
  c(mean = mean(x),sd = sd(x))
}

示例数据

library(data.table)
a<- data.table(Accuracy = 1:10, Specificity = 12:21, Sensitivity = 101 : 110)

谢谢,它有效。你能解释一下使用unlist的原因吗?以及如何将结果制作成数据表。 - costa_25
@costa_25 lapply 将为每个列调用一次(在您的情况下为3次)。它将返回一个包含3个项目的列表(每个项目包含2个叶子)。默认情况下,它将强制转换为2行,但 unlist 将使其变为1行。尝试这两个命令,您就会明白:1)lapply(a, test) %>% as.data.frame() 2)lapply(a, test) %>% unlist() - MKR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接