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

如何用R筛选并统计X有效观测早于Y的纵向研究参与者数量

在R中筛选满足X有效观测早于Y有效观测的纵向数据参与者

需求说明

从长格式纵向数据中筛选**存在某时间点Variable X有有效响应(非NA),且后续时间点Variable Y有有效响应(非NA)**的参与者。直接删除所有NA会丢失关键数据,需基于参与者的时间序列特征判断。

示例数据

# 构造示例数据框
df <- data.frame(
  ID = c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5),
  year = c(2000,2002,2003,2000,2002,2003,2000,2002,2003,2000,2002,2003,2000,2002,2003),
  X = c(NA,NA,2,3,NA,4,1,2,3,2,NA,4,4,NA,NA),
  Y = c(NA,3,4,NA,2,3,3,NA,4,NA,NA,2,1,NA,NA)
)

实现方法

方法1:使用dplyr(tidyverse工具链)

library(dplyr)

# 筛选符合条件的参与者ID
valid_ids <- df %>%
  group_by(ID) %>%
  summarise(
    # 提取当前参与者所有X非NA的年份
    x_valid_years = list(year[!is.na(X)]),
    # 提取当前参与者所有Y非NA的年份
    y_valid_years = list(year[!is.na(Y)]),
    # 判断是否存在X有效年份早于Y有效年份的情况
    meets_condition = any(sapply(x_valid_years, function(x) any(y_valid_years[[1]] > x)))
  ) %>%
  filter(meets_condition) %>%
  pull(ID)

# 过滤原数据,保留符合条件的参与者记录
filtered_data <- df %>% filter(ID %in% valid_ids)

# 统计符合条件的参与者数量
cat("符合条件的参与者数量:", length(valid_ids), "\n")

方法2:基础R实现

# 按ID拆分数据组
id_groups <- split(df, df$ID)

# 遍历每个组,判断是否满足条件
valid_ids_base <- sapply(id_groups, function(group) {
  x_years <- group$year[!is.na(group$X)]
  y_years <- group$year[!is.na(group$Y)]
  # 检查是否存在X年份小于Y年份的组合
  any(outer(x_years, y_years, "<"))
})

# 提取符合条件的ID
valid_ids_base <- names(valid_ids_base)[valid_ids_base]

# 筛选原数据
filtered_data_base <- df[df$ID %in% valid_ids_base, ]

# 统计数量
cat("符合条件的参与者数量:", length(valid_ids_base), "\n")

结果说明

两种方法都会筛选出示例中的ID 2、3、4,统计得到符合条件的参与者数量为3。

内容的提问来源于stack exchange,提问作者thaizee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:13:15