如何用R筛选同一Application下含C、D、E决策序列的ID
R语言筛选包含C→D→E决策序列的Application对应的ID
下面分两种常见场景给出解决方案,你可以根据实际需求选择:
场景1:同一Application下存在连续的C→D→E决策序列
如果要求三个决策是连续出现的(比如某三行的Decision依次是C、D、E),可以用以下dplyr代码:
library(dplyr) # 假设你的数据集名为df,包含ID、Application、Decision三列 df_filtered <- df %>% group_by(Application) %>% # 生成前1位、前2位的决策值,用于检查连续序列 mutate( prev_decision1 = lag(Decision, 1), prev_decision2 = lag(Decision, 2) ) %>% # 标记当前Application组是否存在目标连续序列 mutate(has_target_seq = any(Decision == "E" & prev_decision1 == "D" & prev_decision2 == "C", na.rm = TRUE)) %>% # 筛选出属于符合条件组的所有数据 filter(has_target_seq) %>% # 清理临时生成的辅助列 select(-prev_decision1, -prev_decision2, -has_target_seq) %>% ungroup()
场景2:同一Application下按顺序出现C、D、E(不要求连续)
如果只要求C在D之前出现、D在E之前出现(中间可以有其他决策),可以用这个方法:
library(dplyr) df_filtered <- df %>% group_by(Application) %>% # 计算每个决策在组内的首次出现位置 mutate( first_C = min(which(Decision == "C")), first_D = min(which(Decision == "D")), first_E = min(which(Decision == "E")) ) %>% # 判断是否满足C先出现、然后D、最后E的顺序 mutate(has_target_seq = !is.na(first_C) & !is.na(first_D) & !is.na(first_E) & first_C < first_D & first_E > first_D) %>% # 筛选符合条件组的所有数据 filter(has_target_seq) %>% # 清理辅助列 select(-first_C, -first_D, -first_E, -has_target_seq) %>% ungroup()
大数据集优化方案(data.table)
如果你的数据集行数较多,用data.table会更高效:
连续序列场景
library(data.table) setDT(df) df_filtered <- df[, { # 检查组内是否存在连续的C→D→E seq_exists <- any(shift(Decision, 2) == "C" & shift(Decision, 1) == "D" & Decision == "E", na.rm = TRUE) .SD[seq_exists] }, by = Application]
非连续但顺序正确场景
library(data.table) setDT(df) df_filtered <- df[, { first_C <- min(which(Decision == "C")) first_D <- min(which(Decision == "D")) first_E <- min(which(Decision == "E")) seq_exists <- !is.na(first_C) & !is.na(first_D) & !is.na(first_E) & first_C < first_D & first_E > first_D .SD[seq_exists] }, by = Application]
核心思路是先按Application分组,确认该组是否满足决策序列条件,再保留该组下的所有ID数据,这样就能包含像805这样属于符合条件组的所有记录。
内容的提问来源于stack exchange,提问作者dobiii
相关产品推荐
相关产品推荐

