使用 ifelse 和 is.na 进行变异
Mutate across with ifelse and is.na
我有下面列出的格式的数据,其中我需要使用的所有变量都是 NA
或变量的名称,我需要将 NA 更改为 0 并将字符串到 1。我正在尝试使用 dplyr::across()
和 ifelse()
,但返回的全是 1。我现在唯一可行的解决方案是单独改变每个变量。
我如何一次将多个变量中的所有 NA
更改为 0 并将所有字符串更改为 1?
library(dplyr)
color_names <- c("black", "grey", "white", "purple")
my_colors <- tribble(
~black, ~grey, ~white, ~purple,
NA, "grey", NA, "purple",
NA, NA, "white", NA,
"black",NA, NA, NA,
NA, "grey", NA, NA
)
my_colors %>%
mutate(across(all_of(color_names), ~ifelse(is.na(cur_column()), 0, 1)))
#> # A tibble: 4 x 4
#> black grey white purple
#> <dbl> <dbl> <dbl> <dbl>
#> 1 1 1 1 1
#> 2 1 1 1 1
#> 3 1 1 1 1
#> 4 1 1 1 1
由 reprex package (v0.3.0)
于 2021 年 1 月 13 日创建
你可以试试这个:
my_colors %>% mutate(across(everything(), ~if_else(is.na(.x), 0, 1)))
我猜你可以这样做:
library(tidyverse)
color_names <- c("black", "grey", "white", "purple")
my_colors <- tribble(
~black, ~grey, ~white, ~purple,
NA, "grey", NA, "purple",
NA, NA, "white", NA,
"black",NA, NA, NA,
NA, "grey", NA, NA
)
my_colors %>%
mutate(across(.cols = everything(),
.fns = ~ ifelse(is.na(.x) == TRUE, 0, 1)))
# A tibble: 4 x 4
black grey white purple
<dbl> <dbl> <dbl> <dbl>
1 0 1 0 1
2 0 0 1 0
3 1 0 0 0
4 0 1 0 0
使用 across
你可以通过以下方式避免 ifelse
:
library(dplyr)
my_colors %>% mutate(across(.fns = ~+(!is.na(.))))
但是,您也可以避免使用 across
,因为 is.na
与 dataframes/tibbles 一起使用。
my_colors[] <- +(!is.na(my_colors))
my_colors
#A tibble: 4 x 4
# black grey white purple
# <int> <int> <int> <int>
#1 0 1 0 1
#2 0 0 1 0
#3 1 0 0 0
#4 0 1 0 0
!is.na(.)
returns 逻辑向量 TRUE
/FALSE
和 +
用于将它们转换为 1
/0
.
这个也行,我觉得是最简单的方法。
tribble(
~black, ~grey, ~white, ~purple,
NA, "grey", NA, "purple",
NA, NA, "white", NA,
"black",NA, NA, NA,
NA, "grey", NA, NA
) %>%
modify(~ ifelse(is.na(.), 0, 1))
# A tibble: 4 x 4
black grey white purple
<dbl> <dbl> <dbl> <dbl>
1 0 1 0 1
2 0 0 1 0
3 1 0 0 0
4 0 1 0 0
我有下面列出的格式的数据,其中我需要使用的所有变量都是 NA
或变量的名称,我需要将 NA 更改为 0 并将字符串到 1。我正在尝试使用 dplyr::across()
和 ifelse()
,但返回的全是 1。我现在唯一可行的解决方案是单独改变每个变量。
我如何一次将多个变量中的所有 NA
更改为 0 并将所有字符串更改为 1?
library(dplyr)
color_names <- c("black", "grey", "white", "purple")
my_colors <- tribble(
~black, ~grey, ~white, ~purple,
NA, "grey", NA, "purple",
NA, NA, "white", NA,
"black",NA, NA, NA,
NA, "grey", NA, NA
)
my_colors %>%
mutate(across(all_of(color_names), ~ifelse(is.na(cur_column()), 0, 1)))
#> # A tibble: 4 x 4
#> black grey white purple
#> <dbl> <dbl> <dbl> <dbl>
#> 1 1 1 1 1
#> 2 1 1 1 1
#> 3 1 1 1 1
#> 4 1 1 1 1
由 reprex package (v0.3.0)
于 2021 年 1 月 13 日创建你可以试试这个:
my_colors %>% mutate(across(everything(), ~if_else(is.na(.x), 0, 1)))
我猜你可以这样做:
library(tidyverse)
color_names <- c("black", "grey", "white", "purple")
my_colors <- tribble(
~black, ~grey, ~white, ~purple,
NA, "grey", NA, "purple",
NA, NA, "white", NA,
"black",NA, NA, NA,
NA, "grey", NA, NA
)
my_colors %>%
mutate(across(.cols = everything(),
.fns = ~ ifelse(is.na(.x) == TRUE, 0, 1)))
# A tibble: 4 x 4
black grey white purple
<dbl> <dbl> <dbl> <dbl>
1 0 1 0 1
2 0 0 1 0
3 1 0 0 0
4 0 1 0 0
使用 across
你可以通过以下方式避免 ifelse
:
library(dplyr)
my_colors %>% mutate(across(.fns = ~+(!is.na(.))))
但是,您也可以避免使用 across
,因为 is.na
与 dataframes/tibbles 一起使用。
my_colors[] <- +(!is.na(my_colors))
my_colors
#A tibble: 4 x 4
# black grey white purple
# <int> <int> <int> <int>
#1 0 1 0 1
#2 0 0 1 0
#3 1 0 0 0
#4 0 1 0 0
!is.na(.)
returns 逻辑向量 TRUE
/FALSE
和 +
用于将它们转换为 1
/0
.
这个也行,我觉得是最简单的方法。
tribble(
~black, ~grey, ~white, ~purple,
NA, "grey", NA, "purple",
NA, NA, "white", NA,
"black",NA, NA, NA,
NA, "grey", NA, NA
) %>%
modify(~ ifelse(is.na(.), 0, 1))
# A tibble: 4 x 4
black grey white purple
<dbl> <dbl> <dbl> <dbl>
1 0 1 0 1
2 0 0 1 0
3 1 0 0 0
4 0 1 0 0