【发布时间】:2019-03-30 09:21:09
【问题描述】:
我有一个名为 z 的大数据框,它有 107310 行和 8 列。它通过此函数时没有 NA:z<-z[complete.cases(z),] 以消除所有包含 NA 的行。
如果特定列的值高于另一个特定列的值,我创建了以下 for 循环以删除所有行。
首先,我尝试了以下代码:
for(row in 1:nrow(z)){
i <- z[row, 1]
j <- z[row, 2]
ci<- z[row, 6]
cj<- z[row, 7]
year <- z[row, 8]
if(cj>ci){
z<-z[-row,]}
}
循环会运行,但会停在指示以下错误的某行:
“错误:需要 TRUE/FALSE 的地方缺少值”
即使没有 NA,我也调整了循环以避免错误,使 if 语句中的值始终为数字:
for(row in 1:nrow(z)){
i <- z[row, 1]
j <- z[row, 2]
ci<- z[row, 6]
cj<- z[row, 7]
year <- z[row, 8]
temp<-ci-cj
temp<-ifelse(!is.na(temp),temp,0)
if(temp<=0){
z<-z[-row,]}
}
但是,循环在消除所有包含 cj>ci 的行之前仍会停止。它为 i 和 j 生成的最后一个值为 NA,而为 ci 和 cj 生成的最后一个值为 NA_real,即使这些值在数据集中不是 NA。
有人知道发生了什么吗? 谢谢
【问题讨论】:
-
你不只是在做
z[z[,6]>=z[,7],]有什么特别的原因吗? -
您定义在帧最大时要循环的行数。如果删除了任何行,最终循环将转到比
z当前包含的行号更高的行号。 (1:nrow(z)只评估一次。)也许你可以使用row <- 1; while (row < nrow(z)) { ...; if (temp<=0) z <- z[-row,] else row <- row + 1; } -
非常感谢!!是的,我绝对可以按照 iod 所说的去做,效果很好。另外,感谢 yoy r2evans,它的解释很有意义。对不起初学者的错误。
标签: r for-loop if-statement na