R语言如何对数据框列内匹配指定向量的多个值recode重编码
原代码问题
dplyr::recode()的参数要求为旧值 = 新值的键值对结构,代码中传入vector="no"时,函数会将vector识别为需要匹配的单个字符串,而非你预先定义的存储了"a"、"c"的向量,因此无法实现预期的批量匹配替换效果。
正确实现方案
方案1:使用if_else()实现(最简洁,适合二分类替换场景)
仅需匹配指定向量内的值统一替换为"no",其余值保留的场景,直接用%in%匹配后判断即可:
library(tidyverse) df <- data.frame( num = 1:5, letter = c("a", "b", "c", "d" , "e") ) vector <- c("a","c") df <- df %>% mutate(letter = if_else(letter %in% vector, "no", letter))
方案2:使用case_when()实现(扩展性强,适合多规则替换场景)
如果后续需要增加其他替换规则,用case_when()的结构更易维护:
df <- df %>% mutate(letter = case_when( letter %in% vector ~ "no", # 可在此处新增其他替换规则 .default = letter ))
方案3:仍使用recode()实现
如果需要沿用recode()的语法,需要先构造命名映射向量,再通过!!!操作符展开为函数参数:
# 构造 旧值=新值 的命名映射向量 recode_map <- setNames(rep("no", length(vector)), vector) # 展开参数传入recode df <- df %>% mutate(letter = recode(letter, !!!recode_map))
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

