【问题标题】:How to use mutate_all and recode together properly using dplyr?如何使用 dplyr 正确使用 mutate_all 和重新编码?
【发布时间】: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[] &lt;- factor(unlist(df), levels = c("Yes", "No", "Maybe"), labels = c(1, 0, NA))
  • 它似乎在mutate 内部工作,即df %&gt;% mutate(a = dplyr::recode(a, Yes = 1, No = 2, Maybe = NA_real_)) # A tibble: 4 × 2 a b &lt;dbl&gt; &lt;chr&gt; 1 1 No 2 NA Maybe 3 2 Yes 4 1 Yes

标签: r dplyr recode


【解决方案1】:

您在dplyr::recode 中反转了“键/值”。这对我有用:

df %>% mutate_all(funs(recode(., Yes = 1L, No = 0L, Maybe = NA_integer_)))

# A tibble: 4 × 2
      a     b
  <dbl> <dbl>
1     1     0
2    NA    NA
3     0     1
4     1     1

请注意,如果您不指定NA 的类型,则会引发错误。

您也可以使用带引号或不带引号的值(例如:Yes'Yes' 都有效)

【讨论】:

  • 对,你甚至不需要引用是,否等
  • 太好了,感谢您的帮助。我对文档示例感到困惑,但我想这是我的错!
猜你喜欢
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
相关资源
最近更新 更多