dplyr变异将“否”转换为0,“是”转换为1

dplyr变异将“否”转换为0,“是”转换为1,r,dplyr,mutate,recode,R,Dplyr,Mutate,Recode,我有一个chr类型的列,我需要它作为布尔值,但将NAs保留为NAs。所需的转换为:否=0,是=1,NA=NA tmp <- tibble(x = 1:7, y = c("No", "Yes", NA, "Yes", "Yes", "Yes", "No")) 尤普差一点就成功了 tmp <- tmp %>% mutate(y=ifelse(is.na(y), y, y == "Yes")) 尤普差一点就成功了 tmp <- tmp %>% mutate(y=ife

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

tmp <- tibble(x = 1:7, y = c("No", "Yes", NA, "Yes", "Yes", "Yes", "No"))
尤普差一点就成功了

tmp <- tmp %>% mutate(y=ifelse(is.na(y), y, y == "Yes"))
尤普差一点就成功了

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)))

我使用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
您可以直接执行以下操作:

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)
输出

# 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

这只是另一个解决方案,它在将来需要重新编码更多值时非常有用

library(dplyr)
tmp$y <- recode(tmp$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)
两者都给出:

另一个解决方案:

# 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 %>% 
  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
这样行吗

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

从技术上讲,这会将“是”更改为1,将除NA之外的所有其他内容更改为“零”。这是真的。从技术上讲,这会将“是”更改为1,将除NA之外的所有内容更改为“零”。这是真的。只需将z更改为y,也会获得所需的结果哦,天哪!我从来没有发现过。只要把z改成y,你也会得到想要的结果哦,天哪!我都没注意到。