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
我有一个 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