用于返回数据集之间唯一的案例的函数

时间:2017-08-08 20:24:15

标签: r

我正在处理来自纵向调查的数据,该调查具有大量实现波。

在这个阶段,我正在检查每个后续波中有多少新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, ]

然而,在此之后,我坚持创建一些能自动为所有波浪做的功能,因为我不知道处理每个波浪有不同数据集的情况。

2 个答案:

答案 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