我正在尝试将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 ...
答案 0 :(得分:1)
不是一个完整的解决方案,只是其他人的一些信息。
我在Johnson::RE.Johnson
数据框中的列上手动尝试了iris
。它似乎仅适用于Sepal.Length
和Petal.Length
:
lapply(iris[c(1,3)], Johnson::RE.Johnson)
...它会返回您为Sepal.Width
和Petal.Width
提及的错误。
lapply(iris[c(2,4)], Johnson::RE.Johnson)
Error in RE.ADT(xsl[, i]) : object 'p' not found
这看起来很奇怪,因为所有这些列的数据类型都为num
。 iris
数据框似乎没有隐藏在任何地方的任何缺失值或额外字符值,因此我不确定为什么计算适用于这些列但不适用于其他列。
如果不了解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
}