【问题标题】:Basic question on merging two data frames based on different variables基于不同变量合并两个数据框的基本问题
【发布时间】:2020-04-14 15:30:19
【问题描述】:

我有两个不同的 data.frames。尺寸。

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 个观察值。我想在Day 级别上有一个带有连续剧和id1s' 的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

【问题讨论】:

  • 可能不会。没有看到样本数据和样本数据的输出,只能是推测。
  • 只是为了理解:你想保留第一个表中没有信息的元素在第二个表中吗?在这种情况下,你可以试试 anti_join
  • @r2evans 更新了样本数据
  • 您的输出不一致:serial of 10 仅出现在没有 id2df2 中,但您的输出对于这些行有 id2。 1 是从哪里来的?

标签: r dataframe


【解决方案1】:

根据您要求的观察次数,我猜您希望保留来自 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 之间有多个匹配项,则返回匹配项的所有组合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2023-03-09
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多