R语言多列字符变量替换报错:如何将Si替换为Yes并指定列?
R语言数据框指定列替换值的问题解决
我是R语言新手,想要将数据框survey_done的column_a、column_b列中的“Si”替换为“Yes”。
原始数据
survey_done <- data.frame( column_a = c("Si", "Si", "Yes", "No", "No"), column_b = c("Yes", "Si", "No", "No", "Si"), stringsAsFactors = FALSE )
期望结果
# column_a column_b # 1 Yes Yes # 2 Yes Yes # 3 Yes No # 4 No No # 5 No Yes
我尝试了以下代码:
survey_done <- survey_done %>% recode(across(c(column_a, column_b), "Sí" = "Yes"))
但出现错误:
Error in `across()`: ! Must be used inside dplyr verbs. Run `rlang::last_error()` to see where the error occurred.
一、修正dplyr代码的错误
报错核心原因是across()必须嵌套在dplyr的动词(如mutate())内部使用,直接在recode()中调用不符合语法。另外注意代码中写的带重音符号的“Sí”和原始数据的“Si”不匹配,需要统一字符。
正确的dplyr写法:
library(dplyr) # 方法1:使用recode survey_done <- survey_done %>% mutate(across(c(column_a, column_b), ~ recode(., "Si" = "Yes"))) # 方法2:使用str_replace_all(适合多值替换场景) survey_done <- survey_done %>% mutate(across(c(column_a, column_b), ~ stringr::str_replace_all(., "Si", "Yes")))
二、其他指定列替换的实现方法
1. Base R 原生方法
无需加载任何扩展包,直接用lapply处理目标列:
cols_to_change <- c("column_a", "column_b") survey_done[cols_to_change] <- lapply(survey_done[cols_to_change], function(x) { replace(x, x == "Si", "Yes") })
2. dplyr旧版语法mutate_at
适合使用低版本dplyr的场景:
survey_done <- survey_done %>% mutate_at(vars(column_a, column_b), ~ recode(., "Si" = "Yes"))
3. data.table 高效方法
针对大数据量场景,data.table的处理速度更快:
library(data.table) setDT(survey_done) survey_done[, c("column_a", "column_b") := lapply(.SD, function(x) { fcase(x == "Si", "Yes", default = x) }), .SDcols = c("column_a", "column_b")]
内容的提问来源于stack exchange,提问作者cat_88
相关产品推荐
相关产品推荐

