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
我有一大堆像这样的小数据集:
>> 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