modify_at 删除列表中每个元素的 NA 值

modify_at to remove NA values in each element in a list

我有一大堆像这样的小数据集:

>> my_list

[[1]]
# A tibble: 6 x 2
   Year FIPS 
  <dbl> <chr>
1  2015 12001
2  2015 51013
3  2015 12081
4  2015 12115
5  2015 12127
6  2015 42003

[[2]]
# A tibble: 9 x 2
   Year FIPS 
  <dbl> <chr>
1  2017 04013
2  2017 10003
3  2017 NA   
4  2017 25005
5  2017 25009
6  2017 25013
7  2017 25017
8  2017 25021
9  2017 25027

...

我想使用 modify_at 从每个小标题中删除 NA,因为看起来是一种干净的方法。这是我的尝试:

my_list %>% modify_at(c("FIPS"), drop_na)

我也尝试过 na.omit,但在这两种情况下我都遇到了同样的错误:

Error: character indexing requires a named object

有人可以帮我吗?我做错了什么?

正在创建一些数据。

library(tidyverse)
mylist <-
  list(tibble(a = c(1, 2, NA),
              b = c(2, 2, 2)),
       tibble(c = rep(1, 5),
              d = sample(c(NA, 2), 5, replace = TRUE)))

purrr::modify_at() 中的 .at 参数指定要修改的列表元素,而不是嵌套在列表中的数据框中的列。 purrr::modify() 适合您的目的。

modify(mylist, drop_na)
#> [[1]]
#> # A tibble: 2 x 2
#>       a     b
#>   <dbl> <dbl>
#> 1     1     2
#> 2     2     2
#> 
#> [[2]]
#> # A tibble: 4 x 2
#>       c     d
#>   <dbl> <dbl>
#> 1     1     2
#> 2     1     2
#> 3     1     2
#> 4     1     2

purrr::map() 也有效。由于您的输入和输出都是 list 对象,因此 map() 在这里就足够了,而如果您的输入是另一个 class 而不是常规 list,则 modify() 将是首选] 并且您想为输出保留 class 属性。

map(mylist, drop_na)
#> [[1]]
#> # A tibble: 2 x 2
#>       a     b
#>   <dbl> <dbl>
#> 1     1     2
#> 2     2     2
#> 
#> [[2]]
#> # A tibble: 4 x 2
#>       c     d
#>   <dbl> <dbl>
#> 1     1     2
#> 2     1     2
#> 3     1     2
#> 4     1     2

base R

lapply(mylist, na.omit)
#> [[1]]
#> # A tibble: 2 x 2
#>       a     b
#>   <dbl> <dbl>
#> 1     1     2
#> 2     2     2
#> 
#> [[2]]
#> # A tibble: 4 x 2
#>       c     d
#>   <dbl> <dbl>
#> 1     1     2
#> 2     1     2
#> 3     1     2
#> 4     1     2