2

我有下面概述的格式的数据,其中我需要使用的所有变量要么NA是变量的名称,要么是变量的名称,我需要将 NA 更改为 0,将字符串更改为 1。我正在尝试使用dplyr::across()ifelse(),但返回的都是 1。我现在唯一可行的解​​决方案是单独改变每个变量。

如何NA一次将多个变量的所有 s 更改为 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 包(v0.3.0)于 2021-01-13 创建

4

4 回答 4

4

使用across您可以通过执行以下操作来避免ifelse

library(dplyr)
my_colors %>% mutate(across(.fns = ~+(!is.na(.))))

across但是,您也可以避免is.na使用数据框/小标题。

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(.)返回一个逻辑向量TRUE/FALSE+用于将它们转换为1/ 0

于 2021-01-14T01:19:59.167 回答
2

我想你可以这样做:

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
于 2021-01-14T01:11:51.143 回答
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
于 2021-02-07T22:43:30.543 回答
0

你可以试试这个:

my_colors %>% mutate(across(everything(), ~if_else(is.na(.x), 0, 1)))

于 2021-01-14T01:11:30.400 回答