R语言 如何筛选外部变量指定的变量中有缺失值的案例

o8x7eapl  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(85)

我其实有一个解决这个问题的办法,但我不明白为什么它的工作,或者为什么“明显”的解决方案不工作。这里有一些假数据。我想选择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))),但在某些情况下,我有很多很多变量要过滤。
有人能告诉我为什么代码工作,做,为什么我明显的代码不?

zfycwa2u

zfycwa2u1#

使用drop_na的代码的工作原理是,all_of()将列名向量作为字符串,而在filter中,字符串不被视为列名。在这种情况下,你必须使用.data代词,即。试试filter(!is.na(.data[[the.letter]]))

library(dplyr, warn = FALSE)

for (the.letter in myletters) {
  foo2 <- foo %>%
    filter(!is.na(.data[[the.letter]]))
  print(foo2)
}
#>   a    b    c
#> 1 a <NA> <NA>
#> 2 b <NA> <NA>
#> 3 c <NA> <NA>
#> 4 d <NA> <NA>
#> 5 e <NA> <NA>
#>      a b    c
#> 1 <NA> f <NA>
#> 2 <NA> g <NA>
#> 3 <NA> h <NA>
#> 4 <NA> i <NA>
#> 5 <NA> j <NA>
#>      a    b c
#> 1 <NA> <NA> k
#> 2 <NA> <NA> l
#> 3 <NA> <NA> m
#> 4 <NA> <NA> n
#> 5 <NA> <NA> o

相关问题