我其实有一个解决这个问题的办法,但我不明白为什么它的工作,或者为什么“明显”的解决方案不工作。这里有一些假数据。我想选择a列中具有有效值的案例,然后是B,然后是c。
foo <- data.frame(
a = c(letters[1:5], rep(NA, 10)),
b = c(rep(NA, 5), letters[6:10], rep(NA, 5)),
c = c(rep(NA, 10), letters[11:15])
)
以下是生成的 Dataframe :
> foo
a b c
1 a <NA> <NA>
2 b <NA> <NA>
3 c <NA> <NA>
4 d <NA> <NA>
5 e <NA> <NA>
6 <NA> f <NA>
7 <NA> g <NA>
8 <NA> h <NA>
9 <NA> i <NA>
10 <NA> j <NA>
11 <NA> <NA> k
12 <NA> <NA> l
13 <NA> <NA> m
14 <NA> <NA> n
15 <NA> <NA> o
这是我写的代码,用于一次筛选出一列NA:
myletters <- c("a", "b", "c")
for(the.letter in myletters) {
foo2 <- foo %>%
## this doesn't work. Why?
## filter(!is.na(the.letter))
## THIS ONE WORKS!
drop_na(all_of(the.letter))
## this works, too, but you can't run through all the letters
## filter(!is.na(c))
print(foo2)
}
第三次执行for
循环时,它会产生以下结果:
print(foo2)
a b c
1 <NA> <NA> k
2 <NA> <NA> l
3 <NA> <NA> m
4 <NA> <NA> n
5 <NA> <NA> o
这正是我想要的对我来说,最明显的解决方案是filter(!is.na(the.letter))
,但我根本无法让它工作。它根本不是filter
。我可以硬编码字母(如最后一行,filter(!is.na(c))
),但在某些情况下,我有很多很多变量要过滤。
有人能告诉我为什么代码工作,做,为什么我明显的代码不?
1条答案
按热度按时间zfycwa2u1#
使用
drop_na
的代码的工作原理是,all_of()
将列名向量作为字符串,而在filter
中,字符串不被视为列名。在这种情况下,你必须使用.data
代词,即。试试filter(!is.na(.data[[the.letter]]))
: