我正在处理来自纵向调查的数据,该调查具有大量实现波。
在这个阶段,我正在检查每个后续波中有多少新ID(个案)(即wave2与wave1相比,wave2 vs wave3,wave3 vs wave4等)。 每个wave都有自己的数据集。
我创建了一个适用于手动指定wave的代码。它看起来像这样:
# Create example data
wave1 <- data.frame(ID = c(1,2,3,4,5))
wave2 <- data.frame(ID = c(1,2,3,6,7))
wave3 <- data.frame(ID = c(1,2,3,6,8))
# In this step I'm taking out the IDs from the first wave
idwave1 <- as.vector(wave1$ID)
# In this step I exclude the non-unique IDs from the subsequent wave (wave2) so I can get the number of unique IDs
wave2unique <- wave2[! wave2$ID %in% idwave1, ]
# Now I apply the same procedure for the wave2 and wave3
idwave2 <- as.vector(wave2$ID)
wave3unique <- wave3[! wave3$ID %in% idwave2, ]
然而,在此之后,我坚持创建一些能自动为所有波浪做的功能,因为我不知道处理每个波浪有不同数据集的情况。
答案 0 :(得分:1)
如果您的数据位于单个表格中(可能应该如此)......
library(data.table)
wDT = rbindlist(list(wave1, wave2, wave3), idcol = "wave")
wave ID
1: 1 1
2: 1 2
3: 1 3
4: 1 4
5: 1 5
6: 2 1
7: 2 2
8: 2 3
9: 2 6
10: 2 7
11: 3 1
12: 3 2
13: 3 3
14: 3 6
15: 3 8
然后进行反连接:
wDT[!.(wave + 1L, ID), on=.(wave, ID)]
wave ID
1: 1 1
2: 1 2
3: 1 3
4: 1 4
5: 1 5
6: 2 6
7: 2 7
8: 3 8
对于dplyr而不是data.table,有bind_rows
(如rbindlist
)和anti_join
(如x[!i]
)。
答案 1 :(得分:0)
你在寻找下面的东西吗?
wave_ls = list(wave1, wave2, wave3)
f = function(LIST) {
out = list()
for (i in 1:(length(LIST) - 1)) {
wave1 = LIST[[i]]
wave2 = LIST[[i + 1]]
out[[i]] = wave2[!wave2$ID %in% wave1$ID,]
names(out)[i] = paste0('wave', i+1, 'unique')
}
out
}
f(wave_ls)
$wave2unique
[1] 6 7
$wave3unique
[1] 8