R语言:检查分组内Match_N后续行的N1/N2是否出现相同数值
解决方法
首先修正你原始代码里的转义问题,确保数据生成正常:原代码中DATE和ID仅50个值,但N1、N2是1000个,R会自动循环短向量,最终生成1000行数据,每个DATE+ID组合对应20行,这也是后续分组的基础。
下面是实现需求的完整代码,能给每个Match_N非0的行标记该值是否在同一DATE+ID分组的后续行的N1或N2中出现:
library(tidyverse) # 生成原始数据 set.seed(42) df <- data.frame( DATE = as.Date("2021-01-01") + 0:(50-1), ID = 1:50, N1 = round(rnorm(1000, mean = 1150, sd = 4)), N2 = round(rnorm(1000, mean = 1150, sd = 4)) ) %>% arrange(DATE, ID) %>% group_by(DATE, ID) %>% mutate(Match_N = case_when(N1 == N2 ~ N1, TRUE ~ 0)) %>% ungroup() # 核心逻辑:检查匹配值是否在后续行出现 df_result <- df %>% group_by(DATE, ID) %>% # 给每个分组内的行编序号,明确"后续行"范围 mutate(row_num = row_number()) %>% mutate( is_followed = if_else( Match_N != 0, # 提取当前行之后的所有N1、N2值,判断是否包含当前Match_N map_lgl(row_num, ~ any(c(N1[(.):n()], N2[(.):n()]) == Match_N[.])), # Match_N为0时直接标记为FALSE,也可改为NA FALSE ) ) %>% ungroup() # 查看结果示例:筛选匹配行,查看标记结果 df_result %>% filter(Match_N != 0) %>% select(DATE, ID, row_num, Match_N, is_followed) %>% head(10)
代码说明
row_num = row_number():给每个DATE+ID分组内的行从1开始编号,清晰界定“后续行”是指row_num大于当前行的行。map_lgl(...):对每个匹配行,提取分组内当前行之后所有的N1和N2值,检查是否存在与当前Match_N相等的值,返回布尔结果。if_else仅对非0的Match_N行做判断,0值行直接标记为FALSE,可根据需求调整为NA。
你提到的1151在同一分组第15行出现、1146未出现的情况,用这个代码会分别标记is_followed为TRUE和FALSE。
内容的提问来源于stack exchange,提问作者Picard
相关产品推荐
相关产品推荐

