使用 starts_with() 将 NA 替换为 0
replace NA with 0 using starts_with()
我正在尝试替换 tibble
中一组特定列的 NA 值。所有列都以相同的前缀开头,所以我想知道是否有一种简洁的方法可以使用 dplyr
包中的 starts_with()
函数,让我可以做到这一点。
我在 SO 上看到了其他几个问题,但是它们都需要使用特定的列名或位置。我真的很想偷懒,不想定义所有列,只是前缀。
我尝试了 tidyr
包中的 replace_na()
函数,但没有用。我知道我的代码不适合作业,但我的词汇量不够大,不知道去哪里找。
代表:
library(tidyverse)
tbl1 <- tibble(
id = c(1, 2, 3),
num_a = c(1, NA, 4),
num_b = c(NA, 99, 100),
col_c = c("d", "e", NA)
)
replace_na(tbl1, list(starts_with("num_") = 0)))
如何将 mutate_at
与 if_else
(或 case_when
)一起使用?如果您想将感兴趣的列中的所有 NA
替换为 0.
,则此方法有效
mutate_at(tbl1, vars( starts_with("num_") ),
funs( if_else( is.na(.), 0, .) ) )
# A tibble: 3 x 4
id num_a num_b col_c
<dbl> <dbl> <dbl> <chr>
1 1 1 0 d
2 2 0 99 e
3 3 4 100 <NA>
请注意 starts_with
和其他 select 助手 return 一个给出匹配变量位置的整数向量。 我总是必须在我通常使用它们的情况之外尝试使用它们时请记住这一点..
在较新版本的 dplyr 中,使用带波浪号的 list()
而不是 funs()
:
list( ~if_else( is.na(.), 0, .) )
我正在尝试替换 tibble
中一组特定列的 NA 值。所有列都以相同的前缀开头,所以我想知道是否有一种简洁的方法可以使用 dplyr
包中的 starts_with()
函数,让我可以做到这一点。
我在 SO 上看到了其他几个问题,但是它们都需要使用特定的列名或位置。我真的很想偷懒,不想定义所有列,只是前缀。
我尝试了 tidyr
包中的 replace_na()
函数,但没有用。我知道我的代码不适合作业,但我的词汇量不够大,不知道去哪里找。
代表:
library(tidyverse)
tbl1 <- tibble(
id = c(1, 2, 3),
num_a = c(1, NA, 4),
num_b = c(NA, 99, 100),
col_c = c("d", "e", NA)
)
replace_na(tbl1, list(starts_with("num_") = 0)))
如何将 mutate_at
与 if_else
(或 case_when
)一起使用?如果您想将感兴趣的列中的所有 NA
替换为 0.
mutate_at(tbl1, vars( starts_with("num_") ),
funs( if_else( is.na(.), 0, .) ) )
# A tibble: 3 x 4
id num_a num_b col_c
<dbl> <dbl> <dbl> <chr>
1 1 1 0 d
2 2 0 99 e
3 3 4 100 <NA>
请注意 starts_with
和其他 select 助手 return 一个给出匹配变量位置的整数向量。 我总是必须在我通常使用它们的情况之外尝试使用它们时请记住这一点..
在较新版本的 dplyr 中,使用带波浪号的 list()
而不是 funs()
:
list( ~if_else( is.na(.), 0, .) )