![](/img/trans.png)
[英]How to map a function on a nested Tibble in R when there are NA in nested column?
[英]set NA to zero in a nested tibble
我想将嵌套小标题的所有NA
设置为0
:
library(tidyverse)
df <- tibble(x = c(1, 2, NA), y = c("a", NA, "b"), z = list(1:5, rep(NA,10), 10:20))
replace_na
在部分replace_na
效果很好:
df %>% replace_na(list(x = 0, y = "0", z="doesnotwork")) -> df1
df1$x
给我:
[1] 1 2 0
但是,在df1$z
NA
仍然:
[[1]] [1] 1 2 3 4 5
[[2]] [1] NA NA NA NA NA NA NA NA NA NA
[[3]] [1] 10 11 12 13 14 15 16 17 18 19 20
df$z
是一个列表列,因此您需要使用purrr
函数将replace_na
应用于列表的每个元素。 在这里,我们可以使用map
对df$z
每个向量应用replace_na
,将所有NA
替换为0
。 上面的语法将用"doesnotwork"
替换丢失的列表元素 (用NULL
标记),而不丢失列表元素内的值。
library(tidyverse)
df <- tibble(x = c(1, 2, NA), y = c("a", NA, "b"), z = list(1:5, rep(NA,10), 10:20))
df1 <- df %>%
replace_na(list(x = 0, y = "0")) %>%
mutate(z = map(z, replace_na, 0))
df1$z
#> [[1]]
#> [1] 1 2 3 4 5
#>
#> [[2]]
#> [1] 0 0 0 0 0 0 0 0 0 0
#>
#> [[3]]
#> [1] 10 11 12 13 14 15 16 17 18 19 20
由reprex软件包 (v0.2.0)创建于2018-05-08。
这也可以通过从base R
进行的rapply
(递归应用)来完成
df[] <- rapply(df, function(x) replace(x, is.na(x), 0), how = 'list')
str(df)
#Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 3 obs. of 3 #variables:
# $ x: num 1 2 0
# $ y: chr "a" "0" "b"
# $ z:List of 3
# ..$ : num 1 2 3 4 5
# ..$ : num 0 0 0 0 0 0 0 0 0 0
# ..$ : num 10 11 12 13 14 15 16 17 18 19 ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.