r - 重命名数据框中多个特定因素的级别
问题描述
我有数据框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"
变量V1
、V2
、V3
和V4
- 但不是Location
- 中的值更改为"X"
。我可以轻松地在每一列中手动更改级别的名称,但在大型数据集中这很耗时。但是,如果我使用revalue
,那么我希望保持不变的每个"No"
,包括 中的Location
,都将更改为"X"
:
library("plyr")
as.data.frame(lapply(DF, function(x) { revalue(x, c("No"="X")) }))
有没有办法根据变量在数据集中的位置(此处为 1:2 和 4:5 列)指定重命名适用的变量?
解决方案
使用 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")))
推荐阅读
- python - python中列表的性质,为什么我会得到一个重复列表?
- sql - 将 2 个表与条件合并
- ssl - 使用 SubjectAltName 'OtherName" 在 openSSL 中创建 CSR 时出错
- php - if 语句为真,即使它不是保存票时
- matplotlib - 在双直方图上为每个直方图绘制两条高斯线
- r - 如何在单个列 Rstudio 中改变多个值
- node.js - 如何解决“TypeError:http.IncomingMessage 未定义”
- azure - 用于本地文件的 Azure 自定义脚本扩展 CLI/Powershell
- r - 在 R 中,为什么 list(1:3) 和 list("a", "b","see") 的长度不同?
- pandas - 新列的条件计算