R 基于不同变量合并两个数据帧的基本问题

R 基于不同变量合并两个数据帧的基本问题,r,dataframe,R,Dataframe,我有两个不同大小的数据帧 dim(df1) = 2942 obs. 6 var. dim(df2)= 16533 obs. 2307 var. 我想将df1与df2合并,目标是df3具有2942个观察值 以下变量定义数据框中的观察值:serial(组标识号)、id1(组中的人员标识符范围为1到组中的人数)、Day(记录时的星期日)。day变量定义为:Mon.:1;星期二:2;星期三:3,星期四:4,星期五:5,星期六:6,星期日:7 在df2中,对于相同的序列有两个观察值。我想在Day级

我有两个不同大小的数据帧

dim(df1) = 2942 obs.    6 var.
dim(df2)= 16533 obs. 2307 var.
我想将
df1
df2
合并,目标是
df3具有2942个观察值

以下变量定义数据框中的观察值:
serial(组标识号)、id1(组中的人员标识符范围为1到组中的人数)、Day(记录时的星期日)
。day变量定义为:
Mon.:1;星期二:2;星期三:3,星期四:4,星期五:5,星期六:6,星期日:7

df2
中,对于相同的
序列
有两个观察值。我想在
Day
级别上使用序列和
id1s'
的df。因此,基本上我为
df1
df2
创建了一个新的变量索引

library(dplyr)

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


df2<-df2 %>% 
      mutate(index = group_indices_(df2, .dots=c("serial", "id1"))) 
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

根据您要求的观察数量,我猜您希望保留来自df1的所有观察结果。您还说过,观察结果通过序列号、id1、id2和日期进行唯一标识。我会尝试左连接:

left_join(df1,df2,by=c("serial","id1","Day"),suffix=c(".df1",".df2"))
在df2中不匹配的来自df1的观察结果将在新添加的列中包含NAs

一个正确的连接将导致保留来自df2的所有观察结果,并消除来自df1的不匹配的观察结果,这似乎与您试图做的相反

根据文件:

左join()


从x返回所有行,从x和y返回所有列。x中与y中不匹配的行将在新列中具有NA值。如果x和y之间存在多个匹配,则会返回所有匹配的组合。

根据您要求的观察数量,我猜您希望保留df1中的所有观察结果。您还说过,观察结果通过序列号、id1、id2和日期进行唯一标识。我会尝试左连接:

left_join(df1,df2,by=c("serial","id1","Day"),suffix=c(".df1",".df2"))
在df2中不匹配的来自df1的观察结果将在新添加的列中包含NAs

一个正确的连接将导致保留来自df2的所有观察结果,并消除来自df1的不匹配的观察结果,这似乎与您试图做的相反

根据文件:

左join()


从x返回所有行,从x和y返回所有列。x中与y中不匹配的行将在新列中具有NA值。如果x和y之间存在多个匹配项,则会返回所有匹配项的组合。

可能不会。如果看不到样本数据和该样本数据的输出,这只能是推测。请理解:是否要保留第一个表中的元素,而第二个表中没有这些元素的信息?在这种情况下,您可以尝试反_join@r2evans更新了示例数据建议重复:您的输出不一致:
serial
10只出现在
df2
中,该行没有
id2
,但您的输出具有这些行的
id2
。1来自哪里?可能不是。如果看不到样本数据和该样本数据的输出,这只能是推测。请理解:是否要保留第一个表中的元素,而第二个表中没有这些元素的信息?在这种情况下,您可以尝试反_join@r2evans更新了示例数据建议重复:您的输出不一致:
serial
10只出现在
df2
中,该行没有
id2
,但您的输出具有这些行的
id2
。1是从哪里来的?自从我第一次回答这个问题以来,这个问题已经被大量编辑过了,所以也许right_join更接近OP想要的东西。尽管如此,OP表示,他们预计会有2942个obs和2310个var,这不会是右键联接的结果。自从我第一次回答这个问题以来,这个问题已经进行了一些实质性的编辑,所以右键联接可能更接近OP所寻找的。尽管如此,OP表示,他们预计将有2942个obs和2310个var,这不是右联合的结果
serial id1 id2 Day
12      1   1   1
123     1   1   3
123     2   1   2
10      1   1   4
10      2   1   2
left_join(df1,df2,by=c("serial","id1","Day"),suffix=c(".df1",".df2"))