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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:25:36