由于 y 中的重复值,合并 R 中的数据帧而不复制 x 中的行

Merging data frames in R without duplicating rows in x due to repeated values in y

我有两个数据框 EMOJ 和 EYETRACK,我需要通过“会话”合并它们,不要重复行。

数据帧:

> EMOJ
  session age attitude
1    s001  18        2
2    s002  22        4


> EYETRACK
  session stimuli response_time
1    s001       A          1023
2    s001       B          1009
3    s001       C          1832
4    s002       A          1092
5    s002       B          1076

我想要的:

  session age attitude stimuli response_time
1    s001  18        2       A          1023
2    s001                    B          1009
3    s001                    C          1832
4    s002  22        4       A          1092
5    s002                    B          1076

我得到了什么:

df <- merge(EMOJ, EYETRACK, by.x = 'session', by.y = 'session')

  session age attitude stimuli response_time
1    s001  18        2       A          1023
2    s001  18        2       B          1009
3    s001  18        2       C          1832
4    s002  22        4       A          1092
5    s002  22        4       B          1076

我想到了这个,但我不得不将 'stimuli' 添加到 EMOJI df

EMOJ$stimuli <- 'A'

df1 <- merge(EMOJ, EYETRACK, by = c('session','stimuli'), all = TRUE)

使用 dplyr 包:

EMOJ %>%
  left_join(distinct(EYETRACK, session, .keep_all = T)) %>%
  full_join(EYETRACK)

输出

  session age attitude stimuli response_time
1    s001  18        2       A          1023
2    s002  22        4       A          1092
3    s001  NA       NA       B          1009
4    s001  NA       NA       C          1832
5    s002  NA       NA       B          1076

编辑:根据 Ruam 的建议,我包含了输出。出于某种原因,我过去的回复没有给我第一次 运行 时相同的输出,所以我更新了回复。现在应该可以了。

一种方法是对每个会话中的每一行连续编号。然后 mergesession 和这个索引号上。只有来自两个 data.frames 的每个 session 中的第一行将被合并。如果 EMOJ 中每个 session 只有 1 行,可以简单地使用 EMOJ$i <- 1.

library(data.table)

EMOJ$i <- rowid(EMOJ$session)
EYETRACK$i <- rowid(EYETRACK$session)

merge(EYETRACK, EMOJ, by = c("session", "i"), all.x = T)

输出

  session i stimuli response_time age attitude
1    s001 1       A          1023  18        2
2    s001 2       B          1009  NA       NA
3    s001 3       C          1832  NA       NA
4    s002 1       A          1092  22        4
5    s002 2       B          1076  NA       NA