如何在R中基于condition批量处理_added列并生成sum_added列
R语言批量处理data.frame列的解决方案
首先补全原数据定义中缺失的idc向量(原代码未定义,此处假设为1到5):
idc <- 1:5 transaction_id <- c(17,95,27,16,8) r1<- c(84,28,18,51,98) r1_added<- c(66,15,56,22,74) r2<-c(50,58,52,90,97) r2_added <-c(31,95,28,80,9) r3<-c(20,91,61,87,11) r3_added <-c(68,38,99,43,49) condition <- c(0,1,0,1,0) m <- as.data.frame(cbind(idc,transaction_id,r1,r1_added,r2,r2_added,r3,r3_added,condition))
使用dplyr实现需求的完整代码:
library(dplyr) m_processed <- m %>% rowwise() %>% mutate( # 计算sum_added:condition为1时取所有_added列的和,否则为0 sum_added = ifelse(condition == 1, sum(c_across(contains("_added"))), 0), # 批量处理_added列:condition为1时置0,否则保留原值 across(contains("_added"), ~ifelse(condition == 1, 0, .x)) ) %>% ungroup()
关键说明
- 计算顺序:必须先计算
sum_added再修改_added列,确保求和用的是原始列值,避免被修改后的值干扰。 - 批量列处理:通过
across(contains("_added"))一次性选中所有以_added结尾的列,结合ifelse实现条件赋值,无需逐个列手动修改。 - 取消行分组:
rowwise()会让后续操作保持行级处理,完成需求后用ungroup()取消分组,恢复常规的列级操作效率。
验证处理结果:
print(m_processed)
输出结果:
idc transaction_id r1 r1_added r2 r2_added r3 r3_added condition sum_added 1 1 17 84 66 50 31 20 68 0 0 2 2 95 28 0 58 0 91 0 1 148 3 3 27 18 56 52 28 61 99 0 0 4 4 16 51 0 90 0 87 0 1 145 5 5 8 98 74 97 9 11 49 0 0
内容的提问来源于stack exchange,提问作者hfa
相关产品推荐
相关产品推荐

