如何基于R

时间:2019-03-13 20:16:12

标签: r loops for-loop if-statement while-loop

我正在编写一个for循环以删除行5和8之间的所有值均为'NA'的行。但是,它仅删除一些行。当我执行while循环时,它会删除所有行,但是我必须手动结束它(即,这是一个无限循环...我也不知道为什么)

for / if循环:

     for(i in 1:nrow(df)){
if(is.na(df[i,5]) && is.na(df[i,6]) && 
    is.na(df[i,7]) && is.na(df[i,8])){
  df<- df[-i,]
}
  }

while循环(但它是无限的):

 for(i in 1:nrow(df)){
    while(is.na(df[i,5]) && is.na(df[i,6]) && 
        is.na(df[i,7]) && is.na(df[i,8])){
      df<- df[-i,]
    }
      }

有人可以帮忙吗?谢谢!

2 个答案:

答案 0 :(得分:1)

这里发生的是,当您以这种方式删除一行时,它下面的所有行都会“向上移动”以填充剩余的空间。当有重复的行应删除时,第二行将被跳过。想象一下这张桌子:

1 keep
2 delete
3 delete
4 keep

现在,您可以循环显示从1到4(行数)的序列,删除表示delete的行:

i = 1,保留该行...

i = 2,删除该行。现在,数据框如下所示:

1 keep
2 delete
3 keep

i = 3,第三行说保持,所以保持它……最终表是:

1 keep
2 delete
3 keep

但是,在您使用while的示例中,删除步骤将继续在第2行上运行,直到该行不符合条件为止,而不是立即移至i = 3。因此过程进行:

i = 1,保留该行...

i = 2,删除该行。现在,数据框如下所示:

1 keep
2 delete
3 keep

i = 2(再次),删除该行(再次)。现在,数据框如下所示:

1 keep
2 keep

i = 2(再次),该行说要保留,因此请保留并继续到i = 3


我很乐意回答这个问题,而没有提到在R中有很多更好的方法,例如方括号表示法(在R控制台中输入?`[`), filter包或dplyr包中的data.table函数。

这个问题有很多选择:Filter data.frame rows by a logical condition

答案 1 :(得分:0)

将行号存储在向量中,并在循环外部删除。

test <- iris
test[1:5,2:4] <- NA

> head(test)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1          NA           NA          NA  setosa
2          4.9          NA           NA          NA  setosa
3          4.7          NA           NA          NA  setosa
4          4.6          NA           NA          NA  setosa
5          5.0          NA           NA          NA  setosa
6          5.4         3.9          1.7         0.4  setosa

x <- 0


for(i in 1:nrow(test)){
if(is.na(test[i,2]) && is.na(test[i,3]) && 
    is.na(test[i,4])){
  x <- c(x,i)
  }
}
  x
  test<- test[-x,]
  head(test) 

> head(test)
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
8           5.0         3.4          1.5         0.2  setosa
9           4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa
11          5.4         3.7          1.5         0.2  setosa