如何用tidyverse(dplyr/tidyr)实现分组多条件的CND向量生成?
用tidyverse实现CND向量生成及按id汇总
核心思路
- 先统计每行x1-x4中"Y"的数量,作为判断基础
- 验证两个触发条件:单个时间点满足≥3个Y,或连续两个时间点各自≥2个Y
- 按id分组处理时间序列的连续判断,最终生成逐行CND标记和按id汇总结果
完整代码
library(tidyverse) # 假设数据集datFL包含id、time(时间排序列)、x1-x4列 dat_processed <- datFL %>% # 确保同id内的行按时间顺序排列,这是连续时间点判断的前提 arrange(id, time) %>% group_by(id) %>% # 统计每行x1-x4中"Y"的数量 mutate(y_count = rowSums(across(x1:x4) == "Y")) %>% # 分别计算两个条件,再合并生成CND标记 mutate( cond1 = y_count >= 3, # 处理首行无前置行的情况,用replace_na把NA转为FALSE cond2 = y_count >= 2 & replace_na(lag(y_count) >= 2, FALSE), CND = if_else(cond1 | cond2, "Y", "N") ) %>% # 按id汇总:只要该id有任意一行满足条件,汇总结果为Y mutate(CND_summary = if_else(any(CND == "Y"), "Y", "N")) %>% ungroup() # 提取逐行CND向量 cnd_vector <- dat_processed$CND # 提取按id去重后的汇总CND向量 cnd_summary_vector <- dat_processed %>% distinct(id, CND_summary) %>% pull(CND_summary)
代码说明
arrange(id, time):必须保证同id内的行按时间排序,否则连续时间点的判断逻辑会失效across(x1:x4):批量处理x1到x4列,避免重复写列名,适配列名固定的场景replace_na(cond2, FALSE):每个id的第一行没有上一行数据,此时lag(y_count)返回NA,替换为FALSE后不会干扰条件判断any(CND == "Y"):按id汇总时,只要该id下存在满足条件的时间点,就标记为Y
内容的提问来源于stack exchange,提问作者Ph.D.Student
相关产品推荐
相关产品推荐

