【问题标题】:Merging 2 data frames with different sizes合并 2 个不同大小的数据框
【发布时间】:2020-04-10 16:20:49
【问题描述】:

我有 2 个要合并的数据框。在df1observation 中记录了 2 个不同的日期。每条记录都有一个索引,id1 个人识别号,id2 指的是录制的日期(天必须不同)。还有一个 Day 变量记录录制的星期几。

df2 中仅根据序列号和 id1 个人识别号记录观察结果。每人只有一次观察。同样,这里还有一个 Day 变量,用于记录录制的时间。

我想确定 df2 中与 df1 同一天记录的观察结果。

我该怎么做?

样本数据

df1:

    structure(list(index = c(11011202, 11011202, 11011202, 11011202, 
11011203, 11011203, 11011207, 11011207, 11011207, 11011207, 11011209, 
11011209, 11011209, 11011209, 11011210, 11011210, 11011210, 11011210, 
11011211, 11011211, 11011211, 11011211, 11011212, 11011212, 11011212, 
11011212, 11011212, 11011212, 11011212, 11011212, 11011213, 11011213, 
11011213, 11011213, 11011213, 11011213, 11011217, 11011217, 11011219, 
11011219, 11011220, 11011220, 11011220, 11011220, 11011220, 11011220, 
11020202, 11020202, 11020202, 11020202), id1 = c(1, 1, 4, 4, 
1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 
2, 3, 3, 4, 4, 1, 1, 3, 3, 4, 4, 1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 
1, 1, 2, 2), id2 = c(1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 
1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 
2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2), Day = c(5, 1, 5, 
1, 1, 3, 4, 7, 4, 7, 4, 1, 4, 1, 5, 7, 5, 7, 1, 2, 1, 2, 7, 2, 
7, 2, 7, 2, 7, 2, 7, 4, 7, 4, 7, 4, 4, 1, 3, 1, 1, 2, 1, 2, 1, 
2, 4, 7, 4, 7)), row.names = c(NA, -50L), class = c("tbl_df", 
"tbl", "data.frame"))

df2:

    structure(list(Day = c(3, 3, 4, 6, 6, 6, 7, 7, 7, 7, 4, 4, 6, 
6, 6, 4, 3, 7, 7, 5, 5, 7, 5, 6, 6), index = c(11011209, 11011209, 
11011210, 11011212, 11011212, 11011213, 11011213, 11011220, 11011220, 
11020208, 11020212, 11020212, 11020301, 11020301, 11020301, 11020305, 
11020310, 11020315, 11020315, 11020316, 11020316, 11020320, 11020606, 
11020611, 11020611), id1 = c(1, 2, 2, 1, 2, 1, 4, 1, 2, 2, 1, 
2, 1, 2, 3, 1, 1, 1, 2, 1, 2, 2, 1, 1, 2)), row.names = c(NA, 
-25L), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

  • 您好,您所有的“结果”都在df1 中。这是合并问题还是子集问题?你能澄清一下吗?
  • @Ian Campbell 我尝试合并 2 个数据框。我想确定 df2 中记录在 df1 中的观察结果。观察结果之间的区别在于,在具有相同索引的 df1 和 id1 2 中进行了不同的观察,但日期不同。非常感谢
  • 我根据您更新的问题编辑了我的答案。

标签: r dataframe


【解决方案1】:

两个数据集都有duplicateby 变量,导致join 之后的行重复。一种选择是通过这些变量nest,然后进行连接

library(dplyr)
library(tidyr)
df2 %>%
      group_by(Day, index) %>%
      nest %>%
      left_join(df1 %>% 
                   rename(idnew = id1)) %>% 
      unnest(data)

【讨论】:

  • 非常感谢我更新了我的数据样本 - 基本上我想将 df2(25 个观察)与 df1(50 个观察)合并,目标是 25 个观察。但我不知道为什么合并后我会收到 50 个 obs。
  • @user11964604 我检查了你的dput,你的两个数据集都有重复的'Day','index',导致合并后重复检查count(df2, Day, index)count(df1, Day, index)
  • @user11964604 我更新了帖子。请检查是否有帮助
  • 我收到错误提示重命名错误(., idnew = id1):未使用的参数(idnew = id1)>
  • @user11964604 可能是rename 被其他同名包函数屏蔽了。你能把它改成dplyr::rename(idnew = id1))
【解决方案2】:

编辑:根据您的说明,我认为这就是您想要的。我转而使用 tidyverse,因为您的数据存储在 tibbles 中。

library(dplyr)
inner_join(df1,df2,by=c("id1","Day"),suffix=c(".df1",".df2"))
#   index.df1   id1   id2   Day index.df2
#       <dbl> <dbl> <dbl> <dbl>     <dbl>
# 1  11011202     1     1     5  11020316
# 2  11011202     1     1     5  11020606
# 3  11011203     1     2     3  11011209
# 4  11011203     1     2     3  11020310
# 5  11011207     1     1     4  11020212
# 6  11011207     1     1     4  11020305
# 7  11011207     1     2     7  11011220
# 8  11011207     1     2     7  11020315
# 9  11011207     2     1     4  11011210
#10  11011207     2     1     4  11020212
## … with 43 more rows

【讨论】:

  • 我试过了,它减少了观察次数。例如,在我的情况下,df1 有 2942 个观察值,df2 有 16533 个观察值。合并后,我收到 169 个观察结果,而不是 2942 个。我的错误在哪里?
  • @user11964604 如果这不是你想要的,我会说你的问题是错误的。您的问题显示 df1 有 6 行,df2 有 2 行,输出有 2 行。这个答案会产生 2 行的输出,就像您的问题所要求的那样......如果这不是您想要的,请编辑您的问题以更清楚地说明您想要什么。
  • 您好,我的建议:(1)。您可以检查您的 Day 列,例如通过 gsub() 或小写字母或大写字母删除多余的空间。 (2)。转换字符 (3) 中的日期列。将索引列转换为数字...然后尝试merge()all.x=T
  • @Ian Campbell 非常感谢我用 df1 (50obs) 和 df2 (25obs) 更新了样本数据。我想要 25 个(obs),但它给了我 50 个。
  • @GregorThomas 我更新了示例数据:基本上我想要一个 df3 有 25 个观察值,但我不知道如何合并数据框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多