首页 > 解决方案 > 根据组标识符合并数据集

问题描述

我有 2 个数据集,有 2 种不同类型的观察结果。这些观察是在不同的日子里进行的,并以不同的时间间隔记录下来。

两个记录都有一个序列号,用于识别进行观察的一组人。例如序列号 111 表示一群人。这个小组是由不同数量的人组成的。属于这些群体的人数各不相同。例如组 111 由 3 人组成。在日记中,我们可以通过变量来识别属于不同群体的人serialid1例如serial 111 and id1 2,表示观察是由组 111 中的第二个人进行的。还有一个Day变量表示进行观察的工作日。该Day变量从 中获取值1(Monday) to 7 (Sunday)

如果df1我们每人有 1 次观察,则df2每个人必须进行 2 次观察。可以根据 来识别进行观察的人serial, id1 and id2Id2用于在工作日观察之间产生差异。例如 id 111、id1 3 和 id2 2 可以解释为组 111 中的第 2 个人进行的 2 天观察。观察的星期几同样由Day变量保存。

我想找出那些在同一天在两本日记中记录信息的人。那么,谁是在同一天填写这两个记录的人。问题是,df2有 2 个观察值,而df1每人只有一个,这使得合并变得困难。

我合并基于serial and id1但它们不是唯一标识符。我试图创建一个新变量并在“日”级别合并。

如何合并每日级别的 2 个数据集?

library(dplyr)

df1<-df1 %>% 
      mutate(index = group_indices_(df1, .dots=c("serial", "id1"))) 

df2<-df2 %>% 
      mutate(index = group_indices_(df2, .dots=c("serial", "id1", "id2")))

样品日期:

df1

structure(list(serial = c(12, 123, 123, 10, 10), id1 = c(1, 1, 
2, 1, 2), Day = c(1, 3, 2, 4, 2)), class = "data.frame", row.names = c(NA, 
-5L))

df2

structure(list(serial = c(12, 12, 123, 123, 123, 123, 10, 10, 
10, 10, 10, 10), id1 = c(1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 3, 3), 
    id2 = c(1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2), Day = c(1, 6, 
    3, 7, 2, 7, 4, 7, 2, 7, 4, 7), index = c(7L, 8L, 9L, 10L, 
    11L, 12L, 1L, 2L, 3L, 4L, 5L, 6L)), row.names = c(NA, -12L
), class = "data.frame")

样本数据结果:

serial id1 id2 Day
12      1   1   1
123     1   1   3
123     2   1   2
10      1   1   4
10      2   1   2

标签: rdataframe

解决方案


您可以使用 data.table 将相应的id2值从df2to添加到df1更新连接

library(data.table)
setDT(df1)
setDT(df2)

df1[df2, id2 := i.id2, on = .(serial, id1, Day)]

df1
#    serial id1 Day id2
# 1:     12   1   1   1
# 2:    123   1   3   1
# 3:    123   2   2   1
# 4:     10   1   4   1
# 5:     10   2   2   1

推荐阅读