r语言 - 如何比较两个数据框中由另一列分割的列并标记重复的条目?



我有两个数据框baseline1baseline2,都包含同一批参与者及其对某些测试项目的响应。参与者是相同的,他们在基线1和基线2中必须回答的一些项目实际上是重复的。如何为每个参与者标记这些重复的项目?

假设数据是这样的:

set.seed(100)
participants1 <- rep(1:5, each = 5)
items1 <- sample(letters[seq(from = 1, to = 5)], size = 25, replace = TRUE) 
responses1 <- sample(seq(from = 1, to = 7, by = 1), size = 25, replace = TRUE) 
baseline1 <- data.frame(participant = participants1, item = items1, response = responses1)
set.seed(110)
items2 <- sample(letters[seq(from = 3, to = 7)], size = 25, replace = TRUE) 
responses2 <- sample(seq(from = 1, to = 7, by = 1), size = 25, replace = TRUE) 
baseline2 <- data.frame(participant = participants1, item = items2, response = responses2)

因此,两个数据框如下所示:

基线1

participant item response
1            1    b        2
2            1    c        6
3            1    a        5
4            1    b        5
5            1    d        6
6            2    d        6
7            2    b        5
8            2    c        7
9            2    b        7
10           2    e        1
11           3    d        7
12           3    c        5
13           3    c        4
14           3    b        3
15           3    a        7
16           4    b        6
17           4    c        1
18           4    d        1
19           4    d        1
20           4    d        6
21           5    e        3
22           5    c        7
23           5    a        7
24           5    c        1
25           5    d        1

基线2

participant item response
1            1    f        3
2            1    e        6
3            1    c        3
4            1    e        6
5            1    c        5
6            2    e        1
7            2    f        3
8            2    e        4
9            2    e        5
10           2    d        7
11           3    d        3
12           3    c        2
13           3    d        4
14           3    c        1
15           3    g        1
16           4    f        1
17           4    f        5
18           4    c        1
19           4    g        6
20           4    c        6
21           5    f        6
22           5    d        2
23           5    d        4
24           5    f        2
25           5    d        6

我需要为每个参与者标记重复的项目。因此,在基线 1 中标记第 2 行,在基线 2 中标记第 3 行和第 5 行("c"是参与者 1 的重复项目(。其他参与者以此类推。我在想这样的事情:

repeats <- aggregate(baseline1$item, by = list(baseline1$participant), 
function(x) x %in% baseline2$item)
baseline1$repeated <- repeats

但是当然它不起作用,因为我也需要一种方法来根据参与者变量在 baseline2 中拆分"项目"向量。

有什么办法可以用aggregate做到这一点吗?如果没有,其他功能或方式呢?

如前所述,所有参与者都存在于两个数据帧中,我们可以根据c("participant", "item")mergebaseline1baseline2来创建match_df。然后,我们splitmatch_df和基线,在两个数据帧中创建一个duplicate列。

match_df <- unique(merge(baseline1, baseline2, by = c("participant", "item"))[1:2])
baseline1$duplicate <-c(mapply(`%in%`,split(baseline1$item, baseline1$participant), 
split(match_df$item, match_df$participant)))
baseline2$duplicate <-c(mapply(`%in%`,split(baseline2$item, baseline2$participant), 
split(match_df$item, match_df$participant)))

head(baseline1)
#      participant item response duplicate
#1           1    b        2     FALSE
#2           1    c        6      TRUE
#3           1    a        5     FALSE
#4           1    b        5     FALSE
#5           1    d        6     FALSE
#6           2    d        6      TRUE
head(baseline2)
#      participant item response duplicate
#1           1    f        3     FALSE
#2           1    e        6     FALSE
#3           1    c        3      TRUE
#4           1    e        6     FALSE
#5           1    c        5      TRUE
#6           2    e        1      TRUE

首先,我搜索baseline1baseline2中的participantitem,并将其放在tt中。然后你只需要问%in%participantitem是否在tt

.
tt <- unique(interaction(baseline1[1:2]))
tt <- tt[tt %in% unique(interaction(baseline2[1:2]))]
baseline1$repeated <- interaction(baseline1[1:2]) %in% tt
baseline2$repeated <- interaction(baseline2[1:2]) %in% tt
head(baseline1)
#  participant item response repeated
#1           1    b        2    FALSE
#2           1    c        6     TRUE
#3           1    a        5    FALSE
#4           1    b        5    FALSE
#5           1    d        6    FALSE
#6           2    d        6     TRUE
head(baseline2)
#  participant item response repeated
#1           1    f        3    FALSE
#2           1    e        6    FALSE
#3           1    c        3     TRUE
#4           1    e        6    FALSE
#5           1    c        5     TRUE
#6           2    e        1     TRUE

或者你可以像这样直接制作它:

baseline1$repeated <- interaction(baseline1[1:2]) %in% interaction(baseline2[1:2])
baseline2$repeated <- interaction(baseline2[1:2]) %in% interaction(baseline1[1:2])

看看这个存储库,我用熊猫来比较不同的列条目,并计算特定条目重复了多少次。 https://github.com/imneonizer/Pandas-Data-Analysis

最新更新