dplyr mutate 将 "No" 转换为 0 并将 "Yes" 转换为 1

dplyr mutate converting "No" to 0 and "Yes" to 1

我有一个 chr 类型的列,我需要它作为布尔值(但将 NA 保留为 NA)。所需的转换是:否 = 0,是 = 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
 ))

优普差点搞定

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

我想出了一个使用 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)))

你可以直接做:

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

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

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

另一个解决方案:

# 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

这行得通吗?

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