在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
相关产品推荐
相关产品推荐

