我有两个数据框baseline1
和baseline2
,都包含同一批参与者及其对某些测试项目的响应。参与者是相同的,他们在基线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")
merge
baseline1
和baseline2
来创建match_df
。然后,我们split
match_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
首先,我搜索baseline1
和baseline2
中的participant
和item
,并将其放在tt
中。然后你只需要问%in%
participant
和item
是否在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