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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:40:47