在R语言中基于direction列的条件交换col1与col2列指定行的内容
解决方案:处理direction列并交换col1/col2值
针对你的需求,我提供两种基于tidyverse的实现方案,分别对应修改原数据框和生成新列保存结果两种场景:
方案1:直接修改原数据框
我们可以用mutate()结合case_when()来条件性地交换col1和col2的值,并统一将direction设为"+":
library(tidyverse) # 原始数据框 df <- tibble(col1=c(1,10,100,40,1000), col2=c(15,20,50,80,2000), direction=c("+","+","-","+","+"), score=c(50,100,300,10,300)) # 修改原数据框 df <- df %>% mutate( # 当direction为"-"时交换col1和col2,否则保持原值 col1 = case_when(direction == "-" ~ col2, TRUE ~ col1), col2 = case_when(direction == "-" ~ col1, TRUE ~ col2), # 统一将direction设为"+" direction = "+" ) # 查看结果 df
执行后你会得到符合要求的修改后的数据框。
方案2:生成新列保存处理结果
如果不想改动原始数据,我们可以创建新列来存储处理后的值:
library(tidyverse) # 原始数据框 df <- tibble(col1=c(1,10,100,40,1000), col2=c(15,20,50,80,2000), direction=c("+","+","-","+","+"), score=c(50,100,300,10,300)) # 生成新列 df_new <- df %>% mutate( new_col1 = case_when(direction == "-" ~ col2, TRUE ~ col1), new_col2 = case_when(direction == "-" ~ col1, TRUE ~ col2), new_direction = "+" ) # 查看结果 df_new
这个方案会保留原始列,同时新增new_col1、new_col2和new_direction三个列来存储处理后的结果。
补充说明
case_when()在这里比if_else()更灵活,适合多条件判断的场景,这里我们只用到了一个条件,也可以换成if_else(direction == "-", col2, col1)来实现同样的效果。- 两种方案都完全基于tidyverse语法,和你现有的代码风格保持一致。
内容的提问来源于stack exchange,提问作者LDT
相关产品推荐
相关产品推荐

