首页 > 解决方案 > 检查 R 中跨波的多个列中的重叠

问题描述

我有一个超过 5 波的青少年数据集。在每一波中,他们最多提名 3 位朋友。我想添加变量来指示每个朋友是否在上一波数据收集中被提名。

我的数据看起来像这个样本:

student_id    wave       friend1_id    friend2_id       friend3_id        
1             1          3             NA               NA           
2             1          5             2                3            
3             1          2             4                5            
4             1          1             6                NA           
5             1          1             NA               6            
6             1          5             NA               2            
7             1          8             NA               NA           
8             1          NA            9                NA           
9             1          8             7                NA           
10            1          7             9                NA  
1             2          4             NA               NA            
2             2          5             3                NA             
3             2          NA            NA               5            
4             2          NA            NA               NA           
5             2          6             NA               NA            
6             2          5             NA               NA             
7             2          10            1                3           
8             2          9             NA               NA           
9             2          8             6                7           
10            2          7             4                NA            

因此,第 2 波“一致性”变量应如下所示(前一波中不存在 0,但在前一波中存在,如果他们没有在第 2 波中提名某人,则为 NA):

student_id    wave    friend1_consit    friend2_consit    friend3_consit
1             2       0                 NA                NA
2             2       1                 1                 NA
3             2       NA                NA                1 
4             2       NA                NA                NA
5             2       1                 NA                NA       
6             2       1                 NA                NA
7             2       0                 0                 0
8             2       1                 NA                NA
9             2       1                 2                 1
10            2       1                 0                NA

标签: rloopsdplyrdata-manipulationsapply

解决方案


这个答案Base-R返回一个矩阵,其中 student_id 作为行,wave# 作为列:

votes_bywave <- split(df1[,3:5],df1$wave)
votes_bywave <- lapply(votes_bywave, function(x) unique(unlist(x))) 
votes_bywave <- sapply(votes_bywave, function(x) unique(df1$student_id) %in% x )

    > votes_bywave
          1     2
 [1,]  TRUE  TRUE
 [2,]  TRUE FALSE
 [3,]  TRUE  TRUE
 [4,]  TRUE  TRUE
 [5,]  TRUE  TRUE
 [6,]  TRUE  TRUE
 [7,]  TRUE  TRUE
 [8,]  TRUE  TRUE
 [9,]  TRUE  TRUE
[10,] FALSE  TRUE

或者您可能更喜欢列出实际的 Id,在这种情况下,请在末尾添加以下行:

cbind(student_id = unique(df1$student_id), votes_bywave)

      student_id 1 2
 [1,]          1 1 1
 [2,]          2 1 0
 [3,]          3 1 1
 [4,]          4 1 1
 [5,]          5 1 1
 [6,]          6 1 1
 [7,]          7 1 1
 [8,]          8 1 1
 [9,]          9 1 1
[10,]         10 0 1

推荐阅读