【发布时间】:2017-02-22 15:20:39
【问题描述】:
我一直在尝试使用 recode 的 dplyr 变体,并在数据集中的所有变量上结合 mutate_all,但它不会产生预期的输出。我发现的其他答案没有解决这个问题(例如Recode and Mutate_all in dplyr)
这是我尝试过的:
library(tidyverse)
library(car)
# Create sample data
df <- data_frame(a = c("Yes","Maybe","No","Yes"), b = c("No","Maybe","Yes","Yes"))
# Using dplyr::recode
df %>% mutate_all(funs(recode(., `1` = "Yes", `0` = "No", `NA` = "Maybe")))
对值没有影响:
# A tibble: 4 × 2
a b
<chr> <chr>
1 Yes No
2 Maybe Maybe
3 No Yes
4 Yes Yes
我想要的可以使用 car::Recode 来复制:
# Using car::Recode
df %>% mutate_all(funs(Recode(., "'Yes' = 1; 'No' = 0; 'Maybe' = NA")))
这是期望的结果:
# A tibble: 4 × 2
a b
<dbl> <dbl>
1 1 0
2 NA NA
3 0 1
4 1 1
【问题讨论】:
-
这也可以不用
recode来完成 -
我知道可以做到,但我想知道 dplyr::recode 缺少什么。我想避免类似 ifelse 的解决方案。
-
不是答案,而是一个简单的替代方案:
df[] <- factor(unlist(df), levels = c("Yes", "No", "Maybe"), labels = c(1, 0, NA)) -
它似乎在
mutate内部工作,即df %>% mutate(a = dplyr::recode(a, Yes = 1, No = 2, Maybe = NA_real_)) # A tibble: 4 × 2 a b <dbl> <chr> 1 1 No 2 NA Maybe 3 2 Yes 4 1 Yes