首页 > 解决方案 > 重命名数据框中多个特定因素的级别

问题描述

我有数据框DF

DF <- data.frame(V1 = factor(c("Yes", "No", "Yes", "No", "No")),
                 V2 = factor(c("Yes", "No", "No", "Yes", "No")),
                 Location = factor(c("London", "Paris", "No", "Dallas", "No")),
                 V3 = factor(c("No", "Yes", "No", "No", "No")),
                 V4 = factor(c("No", "Yes", "No", "No", "No")))

我想将"No"变量V1V2V3V4- 但不是Location- 中的值更改为"X"。我可以轻松地在每一列中手动更改级别的名称,但在大型数据集中这很耗时。但是,如果我使用revalue,那么我希望保持不变的每个"No",包括 中的Location,都将更改为"X"

library("plyr")
as.data.frame(lapply(DF, function(x) { revalue(x, c("No"="X")) }))

有没有办法根据变量在数据集中的位置(此处为 1:2 和 4:5 列)指定重命名适用的变量?

标签: rdataframe

解决方案


使用 dplyrs quosure 样式 lambda ~ fun(.)作为.funs参数并结合forcats ::fct_recode的另一个解决方案:

library("dplyr")
library("forcats")

(DF <- DF %>%
    mutate_at(vars(-Location), ~fct_recode(., "X" = "No")))

#    V1  V2 Location  V3  V4
# 1 Yes Yes   London   X   X
# 2   X   X    Paris Yes Yes
# 3 Yes   X       No   X   X
# 4   X Yes   Dallas   X   X
# 5   X   X       No   X   X

dplyr 1.0 更新:

across()版本取代了“范围变体”系列,例如mutate_at. across()可以轻松地将相同的转换应用于多个列,允许您在 summarise() 和 mutate() 中使用 select() 语义

应用于此处的问题,以下是实现此目的的两种变体:

DF %>%
  mutate(across((!Location), ~fct_recode(., "X" = "No")))

DF %>%
  mutate(across(c(1:2,4:5), ~fct_recode(., "X" = "No")))

推荐阅读