由于 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 的建议,我包含了输出。出于某种原因,我过去的回复没有给我第一次 运行 时相同的输出,所以我更新了回复。现在应该可以了。
一种方法是对每个会话中的每一行连续编号。然后 merge
在 session
和这个索引号上。只有来自两个 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
我有两个数据框 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 的建议,我包含了输出。出于某种原因,我过去的回复没有给我第一次 运行 时相同的输出,所以我更新了回复。现在应该可以了。
一种方法是对每个会话中的每一行连续编号。然后 merge
在 session
和这个索引号上。只有来自两个 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