如何用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
相关产品推荐
相关产品推荐

