遍历R中的所有行,删除符合条件的行 [英] Iterating through all rows in R, removing those that fit criteria
本文介绍了遍历R中的所有行,删除符合条件的行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
R数据框。它大约有十几列和150行左右。在以下两种情况下,我希望遍历每一行并将其删除
- 第8列的值未定义
- 第8列中其上一行的值已定义。
我的代码看起来是这样的,但它总是崩溃。这一定是个愚蠢的错误,但我想不出来。
for (i in 2:nrow(newfile)){
if (is.na(newfile[i,8]) && !is.na(newfile[(i-1),8]){
newfile<-newfile[-i,]
}
}
显然在本例中,newfile就是我的数据帧。
我收到的错误
[.data.frame
(newfile,-i,)中的错误:找不到对象‘i’
问题解决了,但有些测试数据,如果你们想胡闹的话:
23 L8 29141078 744319 27165443
24 L8 27165443 NA NA
25 L8 28357836 8293 25116398
26 L8 25116398 NA NA
27 L8 28357836 21600 25116398
28 L8 25116398 NA NA
29 L8 40929564 NA NA
30 L8 40929564 NA NA
31 L8 41917264 33234 39446503
32 L8 39446503 NA NA
33 L8 41917264 33981 39446503
34 L8 39446503 NA NA
显然这里做了一些修改,所以现在您正在将第4列与其上一列进行比较(或者您也可以使用第5列,无论哪种方式)
推荐答案
问题是您正在从自己的下面更改数据框;nrow(newfile)
的原始计算不会随着您的操作而更新(如果您有一个C样式的循环for (i=1; i<=nrow(newfile); i++)
...)。另一方面,在while
循环中,每次通过循环都会重新计算条件,所以我认为这是可行的。
i <- 2
while (i<=nrow(newfile)){
if (is.na(newfile[i,8]) && !is.na(newfile[i-1,8])) {
newfile<-newfile[-i,]
}
i <- i+1
}
您没有给我们一个容易重现的答案(即带有答案的测试数据集),所以我现在不打算测试它。
仔细考虑(我现在没有时间给出这一点)可能会导致一种非迭代(因此,如果这很重要,可能会快得多)的方式来完成这项工作。
这篇关于遍历R中的所有行,删除符合条件的行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文