我有一个数据框(我们称之为df
),包含n = 100列(C1
,C2
,...,C100
)和50行(R1
,R2
,...,R50
)。我测试了数据框中的所有列,以确保它们是数字。我想知道使用shapiro.test()
函数每列中的数据是否具有正态分布。
我可以使用代码逐列完成此操作:
> shapiro.test(df$Cn)
或者> shapiro.test(df[,c(Cn)])
但是,当我尝试同时在几列上执行此操作时,它不起作用:> shapiro.test(df[,c(C1:C100)])
返回错误:Error in
[.data.frame
(x, complete.cases(x)) : undefined columns selected
如果有人可以建议一种可以同时进行所有测试并将最终结果存储在新的dataframe/matrix/list/vector中的方法,我将不胜感激。
最佳答案
我并不是说这是一种明智的数据分析方法,但是将功能应用于数据框的列的潜在问题是一个通用任务,可以使用sapply()
或lapply()
(甚至apply()
)之一轻松实现,但是对于数据帧,最好是前面提到的两个功能之一)。
这是一个使用一些伪数据的示例:
set.seed(42)
df <- data.frame(Gaussian = rnorm(50), Poisson = rpois(50, 2),
Uniform = runif(50))
现在应用
shapiro.test()
函数。我们将输出捕获到一个列表中(给定此函数返回的对象),因此我们将使用lapply()
。lshap <- lapply(df, shapiro.test)
lshap[[1]] ## look at the first column results
R> lshap[[1]]
Shapiro-Wilk normality test
data: X[[1L]]
W = 0.9802, p-value = 0.5611
您将需要从这些对象中提取所需的东西,这些对象都具有以下结构:
R> str(lshap[[1]])
List of 4
$ statistic: Named num 0.98
..- attr(*, "names")= chr "W"
$ p.value : num 0.561
$ method : chr "Shapiro-Wilk normality test"
$ data.name: chr "X[[1L]]"
- attr(*, "class")= chr "htest"
如果您希望此对象的
statistic
和p.value
组件用于lshap
的所有元素,我们这次将使用sapply()
来为我们很好地安排结果:lres <- sapply(lshap, `[`, c("statistic","p.value"))
R> lres
Gaussian Poisson Uniform
statistic 0.9802 0.9371 0.918
p.value 0.5611 0.01034 0.001998
鉴于您有500个,我将转置
lres
:R> t(lres)
statistic p.value
Gaussian 0.9802 0.5611
Poisson 0.9371 0.01034
Uniform 0.918 0.001998
如果您打算通过本练习对p值做任何事情,建议您在使用30卡路里的脚射击之前,先考虑如何校正多个比较。
关于r - 在数据框中的多列上使用shapiro.test,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21239826/