在R中筛选两次访视符合指定条件的受试者ID
数据集筛选需求说明
现有包含3个字段的纵向数据集:
- 受试者ID:唯一标识每个受试者
- 访视次数(Visit):仅包含1、2两个取值,对应两次访视记录
- 观测变量(Var):数值型变量,可能存在缺失值
需要筛选满足以下任意一个条件的ID:
- 第2次访视时Var为缺失值
- 两次访视Var取值发生1和2的互换:即第1次为1、第2次为2,或第1次为2、第2次为1
示例数据集结构如下:
ID Visit Var 1 1 2 1 2 2 2 1 1 2 2 2 3 1 2 3 2 1 4 1 2 4 2 NA
上述示例中符合要求的ID为:2、3、4
R语言实现方案
基于tidyverse生态的实现代码:
library(tidyverse) # 构造示例数据 df <- tibble( ID = c(1,1,2,2,3,3,4,4), Visit = c(1,2,1,2,1,2,1,2), Var = c(2,2,1,2,2,1,2,NA) ) # 筛选符合要求的ID result_id <- df %>% group_by(ID) %>% arrange(Visit) %>% # 避免原始数据访视顺序混乱 filter( # 条件1:第二次访视Var为缺失 is.na(nth(Var, 2)) | # 条件2:两次Var为1和2互换 (nth(Var,1) == 1 & nth(Var,2) ==2) | (nth(Var,1) ==2 & nth(Var,2) ==1) ) %>% pull(ID) %>% unique() print(result_id) # 输出结果:2 3 4
Python实现方案
基于Pandas的实现代码:
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame({ 'ID': [1,1,2,2,3,3,4,4], 'Visit': [1,2,1,2,1,2,1,2], 'Var': [2,2,1,2,2,1,2, np.nan] }) def check_condition(group): group = group.sort_values('Visit') var1 = group.iloc[0]['Var'] var2 = group.iloc[1]['Var'] # 判断是否满足任意筛选条件 if pd.isna(var2): return True if (var1 == 1 and var2 ==2) or (var1 ==2 and var2 ==1): return True return False # 筛选符合要求的ID result_id = df.groupby('ID').filter(check_condition)['ID'].unique() print(result_id) # 输出结果:array([2, 3, 4], dtype=int64)
内容的提问来源于stack exchange,提问作者AVA
相关产品推荐
相关产品推荐

