【问题标题】:How to combine two data-frames by group and date如何按组和日期组合两个数据框
【发布时间】:2021-11-23 17:01:15
【问题描述】:

我想在 R 中合并两个数据帧 d1 和 d2。它应该按“ID”分组,但最后应该只存在一列“日期”,以便进一步分析(重要的是知道“数字”条目(d2)是否链接到“类型”条目(d1)或者它与它的接近程度)

假设 d1 和 d2 是

d1 <- data.frame(ID = c(1,1,2,2,2,3), 
                 sex = c("male", "male", "male", "male", "male", "female"),
                 date = c("2016-06-21 08:15:00", "2016-06-21 23:00:00",
                          "2017-04-19 07:15:00", "2017-04-20 07:15:00", "2017-04-20 08:15:00",
                          "2017-08-20 23:15:00" ),
                 type = c("horse", "snake", "horse", "horse", "monkey", "fish"))

d2 <- data.frame(ID = c(1,1,1,2,2,3,3), 
                 date = c("2016-06-20 08:15:00", "2016-06-21 22:15:00", "2016-06-22 08:45:00",
                          "2017-04-19 07:15:00", "2017-04-19 09:30:00",
                          "2017-08-19 08:15:00", "2017-08-21 06:30:00"),
                 number = c(65,234,64,234,6243,23,243))

我想要的输出是

d12 <- data.frame(ID = c(1,1,1,1,1,2,2,2,2,3,3,3),
                  sex = c(NA, "male", NA, "male", NA, "male", NA, "male", "male" , NA, "female", NA),
                  date = c("2016-06-20 08:15:00","2016-06-21 08:15:00", "2016-06-21 22:15:00", "2016-06-21 23:00:00", "2016-06-22 08:45:00",
                          "2017-04-19 07:15:00", "2017-04-19 09:30:00", "2017-04-20 07:15:00", "2017-04-20 08:15:00",
                          "2017-08-19 08:15:00", "2017-08-20 23:15:00", "2017-08-21 06:30:00" ),
                  type = c(NA, "horse", NA, "snake", NA, "horse", NA, "horse", "monkey", NA, "fish", NA),
                  number= c(65, NA, 234, NA, 64, 234, 6243, NA, NA, 23, NA, 243))

我试过这样做

d12 <- full_join(
  d1 %>% group_by(ID) %>% mutate(time=row_number()),
  d2 %>% group_by(ID) %>% mutate(time=row_number()),
by = c("ID", "time"))

但或多或少我只是添加了一些列,我并没有真正接近我想要的输出。我非常期待您的帮助。

【问题讨论】:

  • @RonakShah 我认为这是我的误解。我的意思是它们是否按时间顺序关联。因此,如果我只有一列“日期”,它既指“类型”又指“数字”。
  • d2 缺少 sex 列。 d12:1 male 2016-06-20 08:15:00 &lt;NA&gt; 65的第二行怎么创建? dated1 的第一行不匹配。
  • @MartinGal 提到的数据框只是一个例子。在原始版本中,d2 中有很多列,但 d1 中没有,反之亦然。 d12 中是否有 NA 并不重要。 d12的第二行就是d1的第一行。
  • * d2(对不起)
  • @Franziska 那么对于第 2 行,sex 列必须为空吗?很抱歉,但我仍然不明白合并 d1d2 的算法是什么样子的。

标签: r dataframe group-by merge combine


【解决方案1】:

我对这个问题还是有点疑惑。你可以试试

library(dplyr)

d1 %>% 
  full_join(d2, by = c("ID", "date")) %>% 
  mutate(date = as.POSIXct(date)) %>% 
  arrange(ID, date) %>% 
  tibble() # this line isn't really necessary

返回

      ID sex    date                type   number
   <dbl> <chr>  <dttm>              <chr>   <dbl>
 1     1 NA     2016-06-20 08:15:00 NA         65
 2     1 male   2016-06-21 08:15:00 horse      NA
 3     1 NA     2016-06-21 22:15:00 NA        234
 4     1 male   2016-06-21 23:00:00 snake      NA
 5     1 NA     2016-06-22 08:45:00 NA         64
 6     2 male   2017-04-19 07:15:00 horse     234
 7     2 NA     2017-04-19 09:30:00 NA       6243
 8     2 male   2017-04-20 07:15:00 horse      NA
 9     2 male   2017-04-20 08:15:00 monkey     NA
10     3 NA     2017-08-19 08:15:00 NA         23
11     3 female 2017-08-20 23:15:00 fish       NA
12     3 NA     2017-08-21 06:30:00 NA        243

【讨论】:

  • 也感谢您的耐心等待。现在我注意到了你提到的矛盾。我将编辑我的问题,以便在其他人遇到类似问题时正确。
猜你喜欢
  • 2021-08-01
  • 1970-01-01
  • 2019-08-18
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
相关资源
最近更新 更多