R语言按指定列正负交换两列值并取绝对值的实现方法
R语言数据框条件值交换与转换实现方案
核心处理规则
- 逐行校验
value列的取值:- 取值为负数时:交换对应行
effect列与non_effect列的取值,同时将负数value转为绝对值 - 取值为正数时:保留该行所有字段原始值不变
- 取值为负数时:交换对应行
- 前置注意:初始构造的示例数据中
value列是字符串类型,处理前必须先转为数值类型,否则正负判断逻辑会失效。
方案1:基础R实现(无需安装加载第三方包)
直接运行以下代码即可得到预期结果:
# 构造初始示例数据 id <- c("1", "2", "3", "4", "5") effect <- c("A", "C", "G", "A", "G") non_effect <- c("C", "A", "T", "C", "C") variable1 <- c("X", "X", "X", "X", "X") variable2 <- c("Y", "Y", "Y", "Y", "Y") value <-c("0.2", "-0.1", "-0.3", "0.5", "0.8") df <- data.frame(id, effect, non_effect, variable1, variable2, value, stringsAsFactors = FALSE) # 核心处理步骤 df$value <- as.numeric(df$value) # value列转数值 neg_index <- df$value < 0 # 标记value为负的行 # 交换负数值行的effect和non_effect df[neg_index, c("effect", "non_effect")] <- df[neg_index, c("non_effect", "effect")] df$value <- abs(df$value) # value取绝对值
处理完成后打印df,输出结果和预期完全一致:
id effect non_effect variable1 variable2 value 1 1 A C X Y 0.2 2 2 A C X Y 0.1 3 3 T G X Y 0.3 4 4 A C X Y 0.5 5 5 G C X Y 0.8
方案2:dplyr实现(适配tidyverse工作流)
如果日常数据处理使用dplyr语法,可以用以下更符合管道流的写法:
library(dplyr) df <- df %>% mutate( value = as.numeric(value), # 临时存储原始effect值用于交换 old_effect = effect, effect = if_else(value < 0, non_effect, effect), non_effect = if_else(value < 0, old_effect, non_effect), value = abs(value) ) %>% select(-old_effect) # 删除临时辅助列
内容的提问来源于stack exchange,提问作者zerberus
相关产品推荐
相关产品推荐

