如何基于字符串向量替换数据框现有列内容以生成新列?
问题描述
需要在数据框中基于某列的字符串值创建新列,仅替换指定的部分字符串,其余保持原样。希望通过两个字符串向量(一个存储待替换值,一个存储对应替换后的值)实现,而非逐个编写case_when条件。
原可行代码(手动逐个指定替换规则):
library(dplyr) library(tibble) a <- rep(c("Paul", "Barbara","Joey","Iris"),3) test <- enframe(a) mutate(test, name2 = case_when( value == "Paul" ~ "Anna", value == "Barbara" ~ "Fred", TRUE ~ value) )
尝试用向量批量替换时出现报错:
b <- c("Paul","Barbara") # 待替换的字符串集合 d <- c("Anna","Fred") # 对应的替换后字符串集合 mutate(test, name2 = case_when( value %in% b ~ d, TRUE ~ value) )
报错信息:
Error in
mutate():
! Problem while computingname2 = case_when(value %in% b ~ d, TRUE ~ value).
Caused by error incase_when():
!value %in% b ~ dmust be length 12 or one, not 2.
Runrlang::last_error()to see where the error occurred.
解决方案
方法1:使用dplyr的recode()函数
这是最简洁的批量替换方式,通过创建命名向量传递替换规则:
mutate(test, name2 = recode(value, !!!setNames(d, b)))
setNames(d, b):生成一个命名向量,名字是待替换的字符串(来自b),值是对应的替换结果(来自d)!!!:将命名向量拆分为recode()所需的键值对参数,实现批量替换
方法2:使用match()配合条件判断
通过match()定位每个值在待替换向量中的位置,再提取对应替换值:
mutate(test, name2 = ifelse(value %in% b, d[match(value, b)], value))
match(value, b):返回每个value在b中的索引位置,未匹配到则返回NAifelse仅对匹配成功的元素用d中对应值替换,其余保留原字符串
方法3:使用stringr包的str_replace_all()
若需支持正则表达式替换,可使用str_replace_all(),同样通过命名向量传递规则:
library(stringr) mutate(test, name2 = str_replace_all(value, setNames(d, b)))
内容的提问来源于stack exchange,提问作者Bram Van den Bergh
相关产品推荐
相关产品推荐

