将循环应用于数据框

时间:2017-01-07 18:33:56

标签: r loops dataframe

我正在尝试将RE.Johnson包中的函数Johnson应用到包含157个16个变量的观察值的整个数据框df,我想循环使用所有数据帧而不是手动执行。 我已经尝试了以下代码,但它不起作用。

lapply(df[1:16], function(x) RE.Johnson(x))

我知道这对你们来说似乎很容易,但是我很乐意从R开始。 感谢

修改

R为我提供了答案Error in RE.ADT(xsl[, i]) : object 'p' not found,并且数据未被转换。 以下是数据摘要:

data.frame':    157 obs. of  16 variables:
$ X         : num  786988 781045 777589 775266 786843 ...
$ Y         : num  486608 488691 490089 489293 488068 ...
$ Z         : num  182 128 191 80 131 ...
$ pH        : num  7.93 7.69 7.49 7.66 7.92 7.08 7.24 7.19 7.44 7.37 ...
$ CE        : num  0.775 3.284 3.745 4.072 0.95 ...
$ Nitrate   : int  21 14 18 83 30 42 47 101 85 15 ...
$ NP        : num  19.6 43.6 31.7 18.6 31.7 ...
$ Cl        : num  1.9 21.3 2.56 21.5 3.2 ...
$ HCO3      : num  6.65 4.85 4.4 7.72 4.1 ...
$ CO3       : num  0 0 0 0 0.0736 ...
$ Ca        : num  4.12 7.52 3.48 7.58 4.8 10 4.4 4.6 4.2 7.4 ...
$ Mg        : num  3.94 8.92 2.34 7.1 2.5 ...
$ K         : num  0.1442 0.0759 0.0709 0.3691 0.07 ...
$ Na        : num  2.41 34.55 2.51 44.01 2.1 ...
$ SO4       : num  1.45 23.6 1.2 26.66 2 ...
$ Residu_sec: num  0.496 2.102 2.397 2.606 0.608 ...

2 个答案:

答案 0 :(得分:1)

不是一个完整的解决方案,只是其他人的一些信息。

我在Johnson::RE.Johnson数据框中的列上手动尝试了iris。它似乎仅适用于Sepal.LengthPetal.Length

lapply(iris[c(1,3)], Johnson::RE.Johnson)

...它会返回您为Sepal.WidthPetal.Width提及的错误。

lapply(iris[c(2,4)], Johnson::RE.Johnson)

Error in RE.ADT(xsl[, i]) : object 'p' not found

这看起来很奇怪,因为所有这些列的数据类型都为numiris数据框似乎没有隐藏在任何地方的任何缺失值或额外字符值,因此我不确定为什么计算适用于这些列但不适用于其他列。

如果不了解Johnson::RE.Johnson对数据做了什么,看起来它无法计算p的值,并且无法完成这些列的迭代。

从探索源代码开始,此功能似乎在此时出现故障:

  if (xsb.valida[1, i] == 0) 
    xsb.adtest[1, i] <- (Johnson::RE.ADT(xsb[, i])$p) # succeeds
  if (xsl.valida[1, i] == 0) 
    xsl.adtest[1, i] <- (Johnson::RE.ADT(xsl[, i])$p) # fails
  if (xsu.valida[1, i] == 0) 
    xsu.adtest[1, i] <- (Johnson::RE.ADT(xsu[, i])$p) # fails

该函数尝试在xsl上运行Johnson::RE.ADT,此时此向量仅为0的向量。 RE.ADT返回相同的错误,找不到p值。

答案 1 :(得分:0)

问题是当函数尝试对等值的向量执行Anderson-Darling测试时。如果这样做,您将收到错误:

require(Johnson)
x = rep(1,n=100)
RE.ADT(x)

因此,要解决此问题,您可以在函数RE.Johnson中的IF会话中检查它:

    if (xsb.valida[1, i] == 0 & any(xsb[, i]!=xsb[1, i])){
        xsb.adtest[1, i] <- (RE.ADT(xsb[, i])$p)
    }else{
        xsb.adtest[1, i] <- 0
    }   
    if (xsl.valida[1, i] == 0 & any(xsl[, i]!=xsl[1, i])) {
        xsl.adtest[1, i] <- (RE.ADT(xsl[, i])$p)
    }else{
        xsl.adtest[1, i] <- 0
    }
    if (xsu.valida[1, i] == 0 & any(xsu[, i]!=xsu[1, i])) {
        xsu.adtest[1, i] <- (RE.ADT(xsu[, i])$p)
    }else{
        xsu.adtest[1, i] <- 0
    }