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

在R中按组判断ED=1是否早于surgery=1并生成新列

R语言实现分组判断ED记录是否早于手术记录

问题需求

基于group字段分组,按照order变量的顺序,判断每组中ED=1的记录是否出现在surgery=1的记录之前,生成新列EDbeforesurgery。预期结果:group 1为Y,group 2、3为N。

数据准备

df <- data.frame(
  group = c(1, 1, 1, 2, 2, 3, 3),
  order = c(1, 2, 3, 1, 2, 1, 2),
  ED = c(1, 0, 0, 1, 1, 0, 0),
  surgery = c(0, 0, 1, 0, 0, 0, 1))

解决方案(dplyr 版本)

使用dplyr分组处理,核心逻辑是获取每组中ED=1和surgery=1的最小order值,通过比较这两个值判断先后关系:

library(dplyr)

df_result <- df %>%
  group_by(group) %>%
  mutate(
    # 提取当前组中ED=1的最小order,无匹配则设为无穷大
    min_ED_order = ifelse(any(ED == 1), min(order[ED == 1]), Inf),
    # 提取当前组中surgery=1的最小order,无匹配则设为无穷大
    min_surgery_order = ifelse(any(surgery == 1), min(order[surgery == 1]), Inf),
    # 判断并生成结果列
    EDbeforesurgery = case_when(
      min_ED_order < min_surgery_order ~ "Y",
      TRUE ~ "N"
    )
  ) %>%
  ungroup()

# 查看结果
print(df_result)

解决方案(base R 版本)

如果不使用第三方包,可通过aggregate统计分组信息后合并:

# 统计每组的关键order值
group_stats <- aggregate(
  cbind(ED, surgery) ~ group,
  data = df,
  FUN = function(x) {
    match_idx <- which(x == 1)
    if (length(match_idx) > 0) {
      min(df$order[df$group == unique(df$group)][match_idx])
    } else {
      Inf
    }
  }
)
names(group_stats) <- c("group", "min_ED_order", "min_surgery_order")

# 合并数据并生成结果列
df_result_base <- merge(df, group_stats, by = "group")
df_result_base$EDbeforesurgery <- ifelse(df_result_base$min_ED_order < df_result_base$min_surgery_order, "Y", "N")

# 查看结果
print(df_result_base)

结果说明

  • group 1:存在ED=1(order=1)和surgery=1(order=3),1<3,故为Y
  • group 2:无surgery=1记录,无法满足"ED在手术前"的条件,故为N
  • group 3:无ED=1记录,同样不满足条件,故为N

内容的提问来源于stack exchange,提问作者ltong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 16:32:26