For循环未正确过滤

时间:2019-03-01 01:39:29

标签: r for-loop dplyr

我想打印两个数据帧,其中第一个是列a不是NA的所有行,第二个是列b不是NA的所有行。

这是我的代码。它两次打印整个数据帧,而不会触发过滤器。

a <- cbind(rep(NA, 100), seq(0,99)) 
b <- cbind(seq(0,99), rep(NA, 100))
df <- as.data.frame(rbind(a,b))
names(df) <- c("a", "b")


columns <- c("a", "b")

for (j in columns){
  df %>% filter(!is.na(j)) %>% print()
}

我也尝试使用filter(j != "")并收到了相同的结果。

2 个答案:

答案 0 :(得分:3)

关于为什么要投票,我不知道,但我可以猜测。您使用了不是基于R的函数,而没有发出包含它们的程序包的调用,library,并且您不必要地使用cbind和as.data.frame构造了示例数据框,从而浪费了并可能构成了危险。一次data.frame调用会更高效,更安全且更具表达力。

cbind(as.Date("1970-01-01"))   # causes loss of attributes including class
#     [,1]
#[1,]    0
c(factor("a"))
#[1] 1

以下是如何正确构建像您这样的示例的方法:

df <- data.frame( a = c(rep(NA, 100), seq(0,99)) , 
                   b = c(seq(0,99), rep(NA, 100)))

您可以使用get(假设有一个合适的

)在字符向量中获得名称与名称相同的列或对象。
columns <- c("a", "b")
library(dplyr)
for (j in columns){
    df %>% filter(!is.na( get(j) )) %>% print()
}

答案 1 :(得分:0)

您的意思是:

not_na_a <- data.frame(which(!is.na(df$a)))

#> head(not_na_a)
  which..is.na.df.a..
1                 101
2                 102
3                 103
4                 104
5                 105
6                 106



not_na_b <- data.frame(which(!is.na(df$b)))

#> head(not_na_b)
  which..is.na.df.b..
1                   1
2                   2
3                   3
4                   4
5                   5
6                   6