如何一次更改多个因素的水平

How to change the levels of multiple factors at once

提问人:Lenman55 提问时间:6/1/2023 最后编辑:Lenman55 更新时间:6/1/2023 访问量:217

问:

G'day, 我有一个包含多个因子变量的数据框。

我想将所有这些因素变量的水平更改为相同的水平。 它们都有 16 个级别,我想更改为 7 个级别。

如果我像这样,它已经对我有用了:

data <-
data |>
  mutate(variable = fct_recode(
  variable,
    "new level" = "old level",
     "…"   = "…"
    "new level" = "old level"))

我可以为每一个因素做这件事。

但是由于我还有大约 19 个其他因素,我宁愿用更少的样板而不是一对一来做。

因此,我基本上是在寻找一种方法来同时改变所有 19 个因素的水平

我尝试了一些东西,但没有完全成功。across()

 level_mapping <- c(
  "new level" = "old level",
  "..." = "..."
  "new level" = "old level")

df_new <- df_old %>%
  mutate(across(where(is.factor), ~ fct_recode(., !!!level_mapping)))

我希望我的问题可以理解,任何帮助将不胜感激

[编辑]我忘了提:在改变因子水平的同时,我还想去掉其中一个 一个 repex:

library(dplyr)
df <- data.frame(
  var1 = factor(c("A", "B", "C")),
  var2 = factor(c("A", "B", "C")),
  var3 = factor(c("A", "B", "C"))
)

level_mapping <- c(
  "A" = "R",
  "B" = "E",
  "C" = "F")

df_new <- df %>%
  mutate(across(where(is.factor), ~ recode(., !!!level_mapping))), "F" = NA)))
dplyr tidyverse 数据整理 r 因子

评论

4赞 MrFlick 6/1/2023
这些东西到底有什么问题?你有没有遇到具体的错误?如果您包含一个简单的可重现示例,其中包含可用于测试和验证可能的解决方案的示例输入和所需输出,则更容易为您提供帮助。across
0赞 Lenman55 6/1/2023
感谢您的快速回复。我添加了我的代码片段
4赞 Ben Bolker 6/1/2023
感谢您添加代码片段,但它仍然不是一个可重现的示例。你可以用(比如)3 个因子(每个因子有 3 个级别)制作一个可重复的小例子,这样我们就可以玩它了......
2赞 TarJae 6/1/2023
代替使用mutate(across(where(is.factor), ~ fct_recode(., !!!level_mapping)))mutate(across(where(is.factor), ~ recode(., !!!level_mapping)))
1赞 r2evans 6/1/2023
当您尝试使用真实数据@TarJae的评论时会发生什么?(它对我有用。

答:

3赞 MrFlick 6/1/2023 #1

此代码为我运行

df %>%
  mutate(across(where(is.factor), ~ recode(., !!!level_mapping, "F" = NA_character_)))

Recode 起初抱怨该值,但我将其更改为使用强类型的 NA 值。大多数情况下,让事情正常工作只是涉及将括号移动到正确的位置。NA

评论

0赞 Lenman55 6/1/2023
也对我有用!还注意到我能够修复的数据帧中的一些问题。谢谢