首页 > 解决方案 > 通过 R 中的多个变量对纵向数据集进行子集化

问题描述

我有一个长格式的纵向数据集,其中(除其他外)变量:ID、wave、当前工作、慢性病的发生和自评健康:

ID              wave working Chronic SRH
451101001003    1997      1    0      0
451101020002    1997      1    0      1
451102068003    2000      1    0      1
451103041001    1997      1    0      1
451102004001    1997      0    0      0
451203011001    2004      0    0      0
421103003031    2009      1    0      0
211102009021    2000      1    1      0

对于每个参与者来说,观察的数量是不相等的,因为有些人退出了,而其他人则加入了后来的浪潮。当我正在研究工作条件对健康的影响时,我想从数据集中删除从未工作过的参与者,但保留那些(可能)因健康原因停止工作的参与者。换句话说,工作 = 0,慢性或 SRH = 1 的参与者。

希望这是有道理的。

标签: rsubsetlongitudinal

解决方案


这是一种方法

IDs_out <- df1[rowSums(df1[, c("working", "Chronic", "SRH")]) == 0, ]$ID
df1 <- df1[!df1$ID %in% IDs_out, ]
df1
#            ID wave working Chronic SRH
#1 451101001003 1997       1       0   0
#2 451101020002 1997       1       0   1
#3 451102068003 2000       1       0   1
#4 451103041001 1997       1       0   1
#7 421103003031 2009       1       0   0
#8 211102009021 2000       1       1   0

第一步是找到IDs 的列working, Chronic,SRH都是0。在下一步中,我们ID从您的数据框中筛选出不在IDs_out.

数据

df1 <- structure(list(ID = c(451101001003, 451101020002, 451102068003, 
451103041001, 451102004001, 451203011001, 421103003031, 211102009021
), wave = c(1997L, 1997L, 2000L, 1997L, 1997L, 2004L, 2009L, 
2000L), working = c(1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L), Chronic = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L), SRH = c(0L, 1L, 1L, 1L, 0L, 0L, 
0L, 0L)), .Names = c("ID", "wave", "working", "Chronic", "SRH"
), class = "data.frame", row.names = c(NA, -8L))

推荐阅读