【问题标题】:Mutate across with ifelse and is.na使用 ifelse 和 is.na 进行变异
【发布时间】:2021-01-14 01:00:27
【问题描述】:

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

如何一次将多个变量中的所有 NAs 更改为 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-01-13 创建

【问题讨论】:

    标签: r na dplyr across


    【解决方案1】:

    使用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。

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

        你可以试试这个:

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

        【讨论】:

          【解决方案4】:

          这也行得通,我认为是最简单的方法。

          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-01
            • 2018-10-21
            相关资源
            最近更新 更多