如何用R语言的dplyr包根据其他列条件修改多列值?
使用dplyr处理数据框的条件赋值问题
原始数据框
| cond1 | cond2 | a | b | c | d |
|---|---|---|---|---|---|
| 1 | 0 | 98 | 89 | 78 | 89 |
| 1 | 0 | 45 | 54 | 34 | 56 |
| 0 | 0 | 34 | 233 | 56 | 67 |
| 0 | 0 | 21 | 12 | 4 | 78 |
| 1 | 1 | 1 | 1 | 2 | 89 |
| 1 | 1 | 34 | 4 | 123 | 2 |
需求
当cond1和cond2列的值均为0时,将a、b列设置为0,c、d列设置为1,其余行保留原数值。处理后的理想结果如下:
理想结果数据框
| cond1 | cond2 | a | b | c | d |
|---|---|---|---|---|---|
| 1 | 0 | 98 | 89 | 78 | 89 |
| 1 | 0 | 45 | 54 | 34 | 56 |
| 0 | 0 | 0 | 0 | 1 | 1 |
| 0 | 0 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 2 | 89 |
| 1 | 1 | 34 | 4 | 123 | 2 |
生成原始数据的R代码
library(tidyverse) cond1 = c(1,1,0,0,1,1) cond2 = c(0,0,0,0,1,1) a = c(98,45,34,21,1,34) b = c(89,54,233,12,1,4) c = c(78,34,56,4,2,123) d = c(89,56,67,78,89,2) data = tibble(cond1,cond2,a,b,c,d);data
dplyr实现方案
方法1:逐列使用case_when
直接对每一列单独设置条件逻辑,适合列数较少的场景:
data_processed <- data %>% mutate( a = case_when(cond1 == 0 & cond2 == 0 ~ 0, TRUE ~ a), b = case_when(cond1 == 0 & cond2 == 0 ~ 0, TRUE ~ b), c = case_when(cond1 == 0 & cond2 == 0 ~ 1, TRUE ~ c), d = case_when(cond1 == 0 & cond2 == 0 ~ 1, TRUE ~ d) )
方法2:使用across批量处理列
利用across函数对同规则的列批量操作,代码更简洁高效,适合列数较多的场景:
data_processed <- data %>% mutate( # 对a、b列应用相同规则:满足条件时设为0,否则保留原值 across(c(a, b), ~ case_when(cond1 == 0 & cond2 == 0 ~ 0, TRUE ~ .x)), # 对c、d列应用相同规则:满足条件时设为1,否则保留原值 across(c(c, d), ~ case_when(cond1 == 0 & cond2 == 0 ~ 1, TRUE ~ .x)) )
运行上述代码后,data_processed即为符合需求的数据框。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

