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

时间:2020-04-14 15:30:19

标签: r dataframe

我有两个不同的data.frame与diff。大小。

dim(df1) = 2942 obs.    6 var.
dim(df2)= 16533 obs. 2307 var.

我想将df1df2合并为一个df3 with 2942 observations

以下变量定义了数据帧中的观察值:serial (group indetification number), id1 (person identifier from the group ranges from 1 to number of people in the group), Day (the week day when the record was made)。日期变量定义为:Mon.:1; Tue.:2; Wed.:3, Thur.:4, Fri.:5, Sat.:6, Sun.:7

df2中,对于同一serial有2个观测值。我想要一个包含序列号和id1s'级别的Day的df。所以基本上我为df1df2

创建了一个新的变量索引
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"))) 

请参阅示例数据。

我正在使用上面的代码进行合并:

library(dplyr)
df3<-inner_join(df1,df2,by=c("index","Day"),suffix=c(".df1",".df2"))

..我收到一个df3 with 65 obs. and 2310 var.而不是2942 obs and 2310 var.

有人可以解释为什么我有这个问题吗?

采样日期:

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

1 个答案:

答案 0 :(得分:2)

根据您要查询的观察数,我猜您想保留df1中的所有观察数。您还说观察是由序列号,id1,id2和Day唯一标识的。我会尝试左联接:

left_join(df1,df2,by=c("serial","id1","Day"),suffix=c(".df1",".df2"))

在df2中不匹配的df1中的观测将在新添加的列中包含NA。

正确的联接将保留df2中的所有观察结果,并摆脱df1中的不匹配观察结果,这似乎与您要尝试的相反。

根据文档:

left_join()

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