R 将循环应用于数据帧
我正在尝试将R 将循环应用于数据帧,r,loops,dataframe,R,Loops,Dataframe,我正在尝试将Johnson包中的RE.Johnson函数应用到包含16个变量的157个观察值的整个数据帧df,我希望在所有数据帧中循环,而不是手动执行。 我试过下面的代码,但不起作用 lapply(df[1:16], function(x) RE.Johnson(x)) 我知道这对你们来说可能很容易,但我只是从R开始。 谢谢 编辑 R为我提供了RE.ADT(xsl[,i]):未找到对象“p”中的错误答案,并且数据未转换。 以下是数据摘要: data.frame': 157 obs. of
Johnson
包中的RE.Johnson
函数应用到包含16个变量的157个观察值的整个数据帧df
,我希望在所有数据帧中循环,而不是手动执行。
我试过下面的代码,但不起作用
lapply(df[1:16], function(x) RE.Johnson(x))
我知道这对你们来说可能很容易,但我只是从R开始。
谢谢
编辑
R为我提供了RE.ADT(xsl[,i]):未找到对象“p”中的错误答案,并且数据未转换。
以下是数据摘要:
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 ...
不是一个完整的解决方案,只是为其他人提供一些信息
我在iris
数据框中的列上手动尝试了Johnson::RE.Johnson
。这似乎只适用于萼片长度
和花瓣长度
:
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
if(xsb.valida[1,i]==0)
adtest[1,i]问题是当函数尝试对一个等于值的向量执行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
}
if(xsb.valida[1,i]==0&any(xsb[,i]!=xsb[1,i])){
adtest[1,i]这是模糊的:“但它不起作用。”请进一步解释。是否有错误?输出是否与预期不同?欢迎使用StackOverflow。请花时间阅读此帖子,以及如何提供答案并相应修改您的问题。这些提示可能也很有用。有了数据示例和它给出的错误,将更容易帮助您。typedput(head(df,20))
在控制台中,然后将结果粘贴到此处,以便为我们提供示例数据,如果输入是数据帧并且操作在try:df[,1:16]列上是的,我已经对我的数据运行了相同的测试,有些列有问题,但其他列没有…我不知道为什么要对源代码进行一些探索性的工作,请参见上面的编辑。希望这足以让其他人了解到底发生了什么。