установить NA на ноль во вложенном столбце - PullRequest
0 голосов
/ 09 мая 2018

Я бы хотел установить для всех 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 хорошо работает для части стола:

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

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Это также можно сделать с помощью rapply (рекурсивное применение) из base R

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 ...
0 голосов
/ 09 мая 2018

df$z - это столбец списка, поэтому вам нужно использовать функцию purrr, чтобы применить replace_na к каждому элементу списка. Здесь мы можем просто использовать map, чтобы применить replace_na к каждому вектору в df$z, заменив все NA на 0. Ваш синтаксис, как указано выше, заменит отсутствующий список элементов (отмеченный NULL) на "doesnotwork", не пропуская значения внутри элементов списка.

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

Создано в 2018-05-08 пакетом Представить (v0.2.0).

...