如何用dplyr在R的DataFrame中互换列值?避免替换覆盖
解决DataFrame中cluster列1和2互换的问题
你遇到的覆盖问题确实很常见——先把2改成1之后,原来的1和新生成的1会一起被后续的替换操作改成2,最后完全达不到互换的效果。下面用dplyr和其他R语言方法帮你解决这个问题:
首先先纠正你原始代码里的拼写错误(data.frmae应该是data.frame),正确的原始数据代码是:
data <- data.frame(store=c(122,323,254,435,654,342,234,344), cluster=c(2,2,2,1,1,3,3,3))
方法1:使用dplyr的recode函数(最简洁)
recode可以直接指定值的映射关系,一次性完成互换,不会有覆盖问题:
library(dplyr) # 生成更新后的数据集 data_updated <- data %>% mutate(cluster = recode(cluster, `1` = 2, `2` = 1))
这里的反引号是为了明确指代数字值,避免语法歧义,你也可以直接写1 = 2, 2 = 1,效果是一样的。
方法2:使用dplyr的case_when函数(更灵活)
如果之后需要添加更多替换规则,case_when会更适合,它可以清晰地定义多条件逻辑:
data_updated <- data %>% mutate(cluster = case_when( cluster == 1 ~ 2, # 把1换成2 cluster == 2 ~ 1, # 把2换成1 TRUE ~ cluster # 其他值(比如3)保持原样 ))
方法3:Base R的ifelse嵌套(无需加载包)
如果你不想加载dplyr包,用base R的嵌套ifelse也能实现:
data$cluster <- ifelse(data$cluster == 1, 2, ifelse(data$cluster == 2, 1, data$cluster))
验证结果
运行上述任意一种方法后,你都会得到期望的数据集:
store cluster 1 122 1 2 323 1 3 254 1 4 435 2 5 654 2 6 342 3 7 234 3 8 344 3
这些方法的核心都是基于原始值进行判断替换,不会出现先替换后覆盖的问题,完美解决你的需求。
内容的提问来源于stack exchange,提问作者melik
相关产品推荐
相关产品推荐

