我想使用一个样本的Wilcoxon符号秩测试来测试R中的每一列是否显著大于0。我可以单独遍历每一列,但理想情况下,我希望使用lapply
循环遍历每一行,并将p值记录在一个单独的数据帧中。数据帧的每一行都列出了给定年份的月度值:
df = data.frame("year"=c(1:20), "jan"=runif(20), "feb"=runif(20))
每年和每月共有13列。
我现在使用的代码将每一列都比较为零,但我想结合lapply
函数来简化一些事情:
wilcox.test(df[,1], mu=0, alternative="greater")
我试过:
res = lapply(df, function(x){
wilcox.test(df[,x[1]], mu=0, alternative="greater")
})
但我遇到了一个错误,我对wilcox.test
函数的输入不是数字,这让我认为它不是在单个列中读取的。我在这篇文章中尝试了使用一些建议,但在修改代码以用于一个示例测试时遇到了问题。我是lapply
和写作功能的新手,非常感谢您的帮助!
您可以使用lapply
直接应用于data.frame
中的列。通过只对包含数值的列进行子设置,确保只传递这些列。
lapply(df[,2:13],function(x){wilcox.test(x, mu=0, alternative="greater")})
您的版本不起作用,因为您正试图用df
的整列(即df[,df[,1]]
,而不是df[,1]
(将df
子集化。
为了进一步简化,可以使用sapply
和$p.value
只访问p值结果。
sapply(df[,2:13],function(x){wilcox.test(x, mu=0, alternative="greater")$p.value})
# jan feb mar apr may jun #jul aug sep oct nov
#9.536743e-07 9.536743e-07 9.536743e-07 9.536743e-07 9.536743e-07 9.536743e-07 9.536743e-07 9.536743e-07 9.536743e-07 9.536743e-07 9.536743e-07
# dec
#9.536743e-07
数据
df <- data.frame(year = 1:20, lapply(rep(20,12),runif))
names(df)[2:13] <- tolower(month.abb)