R 基于组标识符合并数据集

R 基于组标识符合并数据集,r,dataframe,R,Dataframe,我有两个数据集,有两种不同类型的观察结果。观察在不同的日子进行,并在不同的时间间隔进行记录 两个记录都有一个序列号,用于识别进行观察的一组人员。例如,序列号111表示一组人。这个群体由不同数量的人组成。属于这些群体的人数各不相同。例如,111组由3人组成。在日记中,我们可以通过序列和id1变量识别属于不同群体的人。例如,序列号111和ID12意味着观察是由111组的2号人员进行的。还有一个日期变量,表示进行观察的一周中的一天。Day变量取值范围为1星期日到7星期日 如果在df1中,我们每人有1次

我有两个数据集,有两种不同类型的观察结果。观察在不同的日子进行,并在不同的时间间隔进行记录

两个记录都有一个序列号,用于识别进行观察的一组人员。例如,序列号111表示一组人。这个群体由不同数量的人组成。属于这些群体的人数各不相同。例如,111组由3人组成。在日记中,我们可以通过序列和id1变量识别属于不同群体的人。例如,序列号111和ID12意味着观察是由111组的2号人员进行的。还有一个日期变量,表示进行观察的一周中的一天。Day变量取值范围为1星期日到7星期日

如果在df1中,我们每人有1次观察,那么在df2中,每人必须进行2次观察。根据序列号、id1和id2可以确定进行观察的人。Id2用于区分周-日观测值。例如,id 111、id1 3和id2 2可解释为来自组111的2号人员进行的2天观察。观察的星期日同样由day变量保存

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

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

如何在每日级别合并这两个数据集

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")))
df2

样本数据结果:

serial id1 id2 Day
12      1   1   1
123     1   1   3
123     2   1   2
10      1   1   4
10      2   1   2
使用合并: out您可以尝试如下合并

merge(df1,df2,all.x = T)[1:4]
以致

> merge(df1,df2,all.x = T)[1:4]
  serial id1 Day id2
1     10   1   4   1
2     10   2   2   1
3     12   1   1   1
4    123   1   3   1
5    123   2   2   1

您可以使用data.table通过更新联接将相应的id2值从df2添加到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

非常感谢我尝试了这个,我收到了丢失的id2值的重复值用:out[!is.naout$id2,]
> merge(df1,df2,all.x = T)[1:4]
  serial id1 Day id2
1     10   1   4   1
2     10   2   2   1
3     12   1   1   1
4    123   1   3   1
5    123   2   2   1
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