R:按变量迭代

时间:2011-04-05 19:18:03

标签: r normal-distribution

我有以下数据集1:

Height | Group
1,556  |  A
2,111  |  B
1,556  |  A
2,341  |  B
1,256  |  A
2,411  |  B

我想通过变量组

计算高度的shapiro wilk正态性检验
myvar <- c("Height")

res<- vector("list", length(myvars))

a <- factor(dataset1$Group)
myfactor <- levels(a)

i=1
for (myfactor in dataset1) {
    res[[i]] <- shapiro.test(dataset1$Size)
    i=i+1
}

res - 返回n组测试,但都具有相同的p值和W. 谁能帮我弄清楚什么是错的?

3 个答案:

答案 0 :(得分:3)

编写新代码比查找代码中的所有错误更容易。

lapply(split(dataset1$Height,dataset1$Group),shapiro.test)

$`  A`

        Shapiro-Wilk normality test

data:  X[[1L]] 
W = 0.75, p-value = 3.031e-08


$`  B`

       Shapiro-Wilk normality test

data:  X[[2L]] 
W = 0.9134, p-value = 0.4295

答案 1 :(得分:3)

你的代码是各种各样的方式。以下是一些:

  1. 您在循环外部创建myfactor,但之后将其设为迭代器。
  2. dataset1是您的数据(data.frame?)。我甚至不确定在myfactor创建的循环中for (myfactor in dataset1)会是什么。
  3. 您不会将发送到shapiro.test的数据进行子集化。
  4. myvars未定义且dataset1$Size可能应为dataset1$Height
  5. 试试这个。

    res <- list()
    for (mf in levels(dataset1$Group)) {
        res[[mf]] <- shapiro.test(dataset1$Height[dataset1$Group == mf])
    }
    

答案 2 :(得分:1)

感谢您的回复 以后通知:
如果您希望通过因子计算(对于数据集中的选定变量)正态性测试:

variaveis <- colnames(dataset1)[c(1:2)]
/////alternative: variaveis <- c("height", "weight") 
res<- vector("list", length(variaveis))

for (i in 1:length(variaveis)) {
    #calcula o shapiro por factor para variaveis selecionadas
    res[[i]] <- lapply(split(dataset1[,variaveis[i]] ,dataset1$sex), shapiro.test)
}
res

PS:性别=前一个例子中的GROUP
再次谢谢你 希望此代码有助于减少代码 微米。