我想打印两个数据帧,其中第一个是列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 != "")
并收到了相同的结果。
答案 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