You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:25:42