遍历R中的所有行,删除符合条件的行 [英] Iterating through all rows in R, removing those that fit criteria

查看:7
本文介绍了遍历R中的所有行,删除符合条件的行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

R数据框。它大约有十几列和150行左右。在以下两种情况下,我希望遍历每一行并将其删除

  1. 第8列的值未定义
  2. 第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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆