You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:01:05