【问题标题】:dplyr mutate converting "No" to 0 and "Yes" to 1dplyr mutate 将“No”转换为 0,将“Yes”转换为 1
【发布时间】:2020-05-22 09:32:44
【问题描述】:

我有一个 chr 类型的列,我需要它作为布尔值(但将 NA 保留为 NA)。所需的转换是:No = 0,Yes = 1,NA = NA

tmp <- tibble(x = 1:7, y = c("No", "Yes", NA, "Yes", "Yes", "Yes", "No"))

我使用以下内容进行变异;但是我不想要一个新变量,而只是更改原来的 y 变量:

tmp = tmp %>% mutate(
 z = case_when(
     y=="No" ~ 0,
     y=="Yes" ~ 1
 ))

【问题讨论】:

  • 只需将z 更改为y 也会得到您想要的结果
  • 天哪!我什至从未发现过。

标签: r dplyr recode


【解决方案1】:

这只是另一种解决方案,在您将来需要重新编码更多值时很有用

library(dplyr)
tmp$y <- recode(tmp$y, "No" = 0, "Yes" = 1)

或在管道中使用mutate

tmp %>% 
  mutate(y = recode(y, "No" = 0, "Yes" = 1))

输出

# A tibble: 7 x 2
#       x     y
#   <int> <dbl>
# 1     1     0
# 2     2     1
# 3     3    NA
# 4     4     1
# 5     5     1
# 6     6     1
# 7     7     0

【讨论】:

    【解决方案2】:

    另一种解决方案:

    # base R style
    tmp$y <- match(tmp$y, c("No","Yes")) - 1L
    
    # tidyverse style
    tmp <- tmp %>% 
      mutate(y = match(y, c("No","Yes")) - 1L)
    

    两者都给出:

    > tmp
    # A tibble: 7 x 2
          x     y
      <int> <int>
    1     1     0
    2     2     1
    3     3    NA
    4     4     1
    5     5     1
    6     6     1
    7     7     0
    

    【讨论】:

      【解决方案3】:

      你可以直接做:

      tmp$y <- +(tmp$y == 'Yes')
      #similar to
      #tmp$y <- as.integer(tmp$y == 'Yes')
      tmp
      
      # A tibble: 7 x 2
      #      x     y
      #  <int> <int>
      #1     1     0
      #2     2     1
      #3     3    NA
      #4     4     1
      #5     5     1
      #6     6     1
      #7     7     0
      

      【讨论】:

      • 从技术上讲,这会将 Yes 更改为 1 和其他所有内容(NA 除外)都为零
      • 嗯,确实如此。
      【解决方案4】:

      这行得通吗?

      tmp %>% 
        mutate(y = 1*(y=="Yes"))
      
      # A tibble: 7 x 2
            x     y
        <int> <dbl>
      1     1     0
      2     2     1
      3     3    NA
      4     4     1
      5     5     1
      6     6     1
      7     7     0
      

      【讨论】:

        【解决方案5】:

        Yopu 差点吃到了。

        tmp <- tmp %>% mutate(y=ifelse(is.na(y), y, y == "Yes"))
        

        【讨论】:

          【解决方案6】:

          我使用ifelse() 函数想出了一个快速而肮脏的修复方法。

          tmp <- tibble(x = 1:7, y = c("No", "Yes", NA, "Yes", "Yes", "Yes", "No"))
          tmp_new <- as_tibble(ifelse(is.na(tmp) == T,NA, ifelse(tmp == "No",0,1)))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-08-11
            • 2013-11-06
            • 2014-01-17
            • 2023-02-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-23
            相关资源
            最近更新 更多