R语言按CustomerID分组修改每组首行Code2值的需求
解决方案:按分组首行条件修改数据
原始数据集
df <- read.table(textConnection("CustomerID Code1 Code2 A 1 1 A 0 1 A 1 1 B 1 0 B 0 1 C 1 1 C 1 1 D 1 0 D 0 1 D 1 1 "), header=TRUE)
使用dplyr(tidyverse)实现
这是简洁的tidy风格实现,通过分组后判断行号和条件修改值:
library(dplyr) df_modified <- df %>% group_by(CustomerID) %>% mutate(Code2 = case_when( row_number() == 1 & Code1 == 1 & Code2 == 1 ~ 0, TRUE ~ Code2 )) %>% ungroup()
group_by(CustomerID):按客户ID分组row_number() == 1:定位每组首行- 当首行同时满足
Code1=1和Code2=1时,将Code2设为0,否则保留原值 ungroup():取消分组,返回标准数据框
使用Base R实现
无需额外包,通过拆分-修改-合并的流程完成:
# 按CustomerID拆分数据为分组列表 grouped_data <- split(df, df$CustomerID) # 遍历每个分组,检查并修改首行 modified_groups <- lapply(grouped_data, function(group) { if (group[1, "Code1"] == 1 && group[1, "Code2"] == 1) { group[1, "Code2"] <- 0 } return(group) }) # 合并所有分组,恢复原始行顺序 df_modified <- do.call(rbind, modified_groups) df_modified <- df_modified[match(rownames(df), rownames(df_modified)), ]
split():将数据拆分为按CustomerID分组的列表lapply():遍历每个分组,检查首行条件并修改do.call(rbind, ...):合并所有修改后的分组- 最后一行代码用于恢复原始数据的行顺序(若不需要分组排序后的结果)
验证结果
运行上述代码后,df_modified将与你提供的目标结果完全一致。
内容的提问来源于stack exchange,提问作者JeffWithpetersen
相关产品推荐
相关产品推荐

