在R语言数据框中交换两个id值的更优方法探究
交换数据框变量中两个值的优雅实现
这里有几种更高效优雅的方法,满足你提出的短代码、同时赋值、无需索引等需求:
方案1:一行代码完成位置交换(短代码+同时赋值)
直接通过match定位目标值的位置,一次性完成交换赋值,无需临时变量:
test$id[c(match(6, test$id), match(3, test$id))] <- c(3, 6)
说明:
match(6, test$id)和match(3, test$id)分别获取6和3的行索引,组合为下标向量- 右侧的
c(3,6)对应赋值,将6的位置设为3,3的位置设为6,实现同时交换
方案2:基于值的映射替换(无需使用索引)
如果不想处理索引,可以直接针对值进行映射替换,用dplyr的recode语法最简洁:
library(dplyr) test$id <- recode(test$id, `6` = 3, `3` = 6)
若使用base R原生实现,可嵌套ifelse:
test$id <- ifelse(test$id == 6, 3, ifelse(test$id == 3, 6, test$id))
说明:
- 直接根据
id的取值替换,无需关心具体位置,逻辑直观 dplyr::recode适合多值替换场景,代码更简洁易读
方案3:base R原生反转交换(短代码+无临时变量)
利用replace和rev函数,一行代码完成交换,完全依赖base R:
test$id <- replace(test$id, test$id %in% c(3,6), rev(test$id[test$id %in% c(3,6)]))
说明:
test$id %in% c(3,6)筛选出需要交换的元素位置rev(test$id[test$id %in% c(3,6)])将筛选出的两个值反转(6→3,3→6)replace函数把原位置的元素替换为反转后的值,完成交换
内容的提问来源于stack exchange,提问作者Near Lin
相关产品推荐
相关产品推荐

