我正在编写一个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,]
}
}
有人可以帮忙吗?谢谢!
答案 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
函数。
答案 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