运行 数据框列的 Shapiro-Wilk 测试,跳过因子

Running Shapiro-Wilk test on columns of a dataframe, skipping factors

我有以下数据框:

alpha<-rnorm(100,40)
beta<-sort(1:100)
gamma<-sample(30:75,100,replace=T)
delta<-c(rep("A",25),rep("B",25),rep("C",25),rep("D",25))
df<-as.data.frame(cbind(alpha,beta,gamma,delta))

我可以将 shapiro.test 应用于个别列,并查看 p 值是否小于 0.05,如下所示:

shapiro.test(alpha)
shapiro.test(alpha)$p.value<0.05

但我想知道我是否可以批量执行此操作,将 shapiro.test 应用于数据框中由连续数据组成的每一列(跳过由因子组成的列)。我想象的方式是:

shapiro.test(names(df))
which(shapiro.test(names(df))$p.value<0.05)

但是没有用。有什么建议么?如果可能的话,我宁愿避免循环。

一般来说,你可以写一点自定义函数,像这样使用它:

alpha<-round(rnorm(100,40))
beta<-sort(1:100)
gamma<-sample(30:75,100,replace=T)
df<-as.data.frame(cbind(alpha,beta,gamma))

myfun <- function(x) res <- shapiro.test(x)$p.value
apply(df, 2, myfun)

您在示例中调用 shapiro.test 的方式没有使用数据框,而是使用工作区中 alpha 的值。

查看 ?apply 了解详情。

编辑:如果您的数据集包含因子,这是跳过它们的一种方法(注意:我修改了您的数据集):

alpha<-rnorm(100,40)
beta<-sort(1:100)
gamma<-sample(30:75,100,replace=T)
delta<-c(rep("A",25),rep("B",25),rep("C",25),rep("D",25))
df<-data.frame(alpha,beta,gamma,delta)

ans <- rep(NA, ncol(df))
for (i in 1:ncol(df)) {
    if (is.factor(df[,i])) next
    ans[i] <- shapiro.test(df[,i])$p.value
    }

然后键入 ans 以查看结果。