【问题标题】:Joining of dataframes based on date.times基于 date.times 加入数据框
【发布时间】:2019-07-18 10:11:33
【问题描述】:

我希望合并两个数据集。 第一个数据集包含特定时间仪器中的 CO2 浓度信息。 第二个数据集包含有关何时开始和结束测量的信息。

我想合并这两个数据帧,以便数据集 1 中数据集 2 中时间间隔(start_date_time 到 end_date_time)内的时间最终位于同一行。这没有很好的解释,所以看下面的数据可能更容易。

我是 R 新手,非常感谢任何帮助。

数据与下图类似。

Data set 1 
 co2               date_time
 0.2               2012-05-01 10:23:20
 0.2               2012-05-01 10:23:23
 0.1               2012-05-01 10:23:26 
 0.6               2012-05-01 10:23:29
 0.1               2012-05-01 10:23:32
 0.1               2012-05-01 10:23:35
 0.6               2012-05-01 10:23:38
 0.6               2012-05-01 10:23:41
 0.2               2012-05-01 10:23:44
 0.2               2012-05-01 10:23:47
 0.3               2012-05-01 10:23:50 
 0.3               2012-05-01 10:23:53
 0.4               2012-05-01 10:23:56
 0.4               2012-05-01 10:23:59
 0.3               2012-05-01 10:24:02
 0.3               2012-05-01 10:24:05
 0.4               2012-05-01 10:24:08
 0.4               2012-05-01 10:24:11
 0.6               2012-05-01 10:24:14
 0.6               2012-05-01 10:24:17
 0.7               2012-05-01 10:24:20
 0.7               2012-05-01 10:24:23
 0.3               2012-05-01 10:24:26
 0.7               2012-05-01 10:24:29
 0.3               2012-05-01 10:24:32
 0.4               2012-05-01 10:24:35
 0.2               2012-05-01 10:24:38
 0.3               2012-05-01 10:24:41
 0.3               2012-05-01 10:24:44
 0.3               2012-05-01 10:24:47
 0.4               2012-05-01 10:24:50
 0.1               2012-05-01 10:24:53
 0.1               2012-05-01 10:24:56

Data set 2
 jar          start_date_time        end_date_time
 1               2012-05-01 10:23:18    2012-05-01 10:23:30
 2               2012-05-01 10:23:31    2012-05-01 10:23:40    
 3               2012-05-01 10:23:41    2012-05-01 10:23:52
 4               2012-05-01 10:23:53    2012-05-01 10:24:01
 5               2012-05-01 10:24:02    2012-05-01 10:24:12
 6               2012-05-01 10:24:13    2012-05-01 10:24:20
 7               2012-05-01 10:24:30    2012-05-01 10:23:40
 8               2012-05-01 10:24:41    2012-05-01 10:24:52

Expected data set
jar start_date_time    end_date_time      co2   date_time
1   05-01-12 10:23:18  05-01-12 10:23:30  0.2   05-01-12 10:23:20
1   05-01-12 10:23:18  05-01-12 10:23:30  0.2   05-01-12 10:23:23
1   05-01-12 10:23:18  05-01-12 10:23:30  0.1   05-01-12 10:23:26
1   05-01-12 10:23:18  05-01-12 10:23:30  0.6   05-01-12 10:23:29
2   05-01-12 10:23:31  05-01-12 10:23:40  0.1   05-01-12 10:23:32
2   05-01-12 10:23:31  05-01-12 10:23:40  0.1   05-01-12 10:23:35
2   05-01-12 10:23:31  05-01-12 10:23:40  0.6   05-01-12 10:23:38
3   05-01-12 10:23:41  05-01-12 10:23:52  0.6   05-01-12 10:23:41
3   05-01-12 10:23:41  05-01-12 10:23:52  0.2   05-01-12 10:23:44
3   05-01-12 10:23:41  05-01-12 10:23:52  0.2   05-01-12 10:23:47
3   05-01-12 10:23:41  05-01-12 10:23:52  0.3   05-01-12 10:23:50
4   05-01-12 10:23:53  05-01-12 10:24:01  0.3   05-01-12 10:23:53
4   05-01-12 10:23:53  05-01-12 10:24:01  0.4   05-01-12 10:23:56
4   05-01-12 10:23:53  05-01-12 10:24:01  0.4   05-01-12 10:23:59
5   05-01-12 10:24:02  05-01-12 10:24:12  0.3   05-01-12 10:24:02
5   05-01-12 10:24:02  05-01-12 10:24:12  0.3   05-01-12 10:24:05
5   05-01-12 10:24:02  05-01-12 10:24:12  0.4   05-01-12 10:24:08
5   05-01-12 10:24:02  05-01-12 10:24:12  0.4   05-01-12 10:24:11
6   05-01-12 10:24:13  05-01-12 10:24:20  0.6   05-01-12 10:24:14
6   05-01-12 10:24:13  05-01-12 10:24:20  0.6   05-01-12 10:24:17
6   05-01-12 10:24:13  05-01-12 10:24:20  0.7   05-01-12 10:24:20
7   05-01-12 10:24:30  05-01-12 10:24:40  0.3   05-01-12 10:24:32
7   05-01-12 10:24:30  05-01-12 10:24:40  0.4   05-01-12 10:24:35
7   05-01-12 10:24:30  05-01-12 10:24:40  0.2   05-01-12 10:24:38
8   05-01-12 10:24:41  05-01-12 10:24:50  0.3   05-01-12 10:24:41
8   05-01-12 10:24:41  05-01-12 10:24:50  0.3   05-01-12 10:24:44
8   05-01-12 10:24:41  05-01-12 10:24:50  0.3   05-01-12 10:24:47
8   05-01-12 10:24:41  05-01-12 10:24:50  0.4   05-01-12 10:24:50

到目前为止,我已经尝试了以下方法:

  sqldf("select * from df1 inner join df2 on (df1.date_time between df2.start_date_time and df2.end_date_time)")

R 消息: match.fun(asfn) 中的错误: 'c("as.hms", "as.difftime")' 不是函数、字符或符号

sqldf("select * from df1 date_time inner join df2 start_date_time on (df1.date_time > df2.start_date_time and d1.date_time <= df2.end_date_time)")

R 消息: result_create(conn@ptr, statement) 中的错误: 没有这样的列:ch4.new_date_time

do.call(rbind, apply(df1, 1, function(x) {
  if(length(idx <- which(x["date_time"] >= df2$start_date_time & x["date_time"] <= df2$end_date_time)) > 0) {
    cbind(rbind(x), df2[idx,])
  }
}))

按照 AEF 的建议

crossing(df1, df2) %>% 
filter(date_time >= start_date_time, date_time < end_date_time)

R 消息: [1] 活动日期_时间 ch4_ppm co2_ppm jar_camp
[6] 罐子运动1年月日
[11] date bvoc start date_time bvoc end date_time bvoc start time bvoc end time
[16] start_date_time end_date_time ch4 开始时间 ch4 结束时间 o2 开始日期时间
[21] o2 结束日期时间 o2 开始时间 o2 结束时间 cmets
(或 0 长度行名称)

【问题讨论】:

标签: r join merge


【解决方案1】:

我认为你可以做到以下几点:

读取您的数据:

library(tidyverse)
library(lubridate)


ds1 <- 
str_replace_all(" co2_conc.         date_time
 0.2               2012-05-01 10:23:20
 0.2               2012-05-01 10:23:23
 0.1               2012-05-01 10:23:26 
 0.6               2012-05-01 10:23:29
 0.1               2012-05-01 10:23:32
 0.1               2012-05-01 10:23:35
 0.6               2012-05-01 10:23:38
 0.6               2012-05-01 10:23:41
 0.2               2012-05-01 10:23:44
 0.2               2012-05-01 10:23:47
 0.3               2012-05-01 10:23:50 
 0.3               2012-05-01 10:23:53
 0.4               2012-05-01 10:23:56
 0.4               2012-05-01 10:23:59
 0.3               2012-05-01 10:24:02
 0.3               2012-05-01 10:24:05
 0.4               2012-05-01 10:24:08
 0.4               2012-05-01 10:24:11
 0.6               2012-05-01 10:24:14
 0.6               2012-05-01 10:24:17
 0.7               2012-05-01 10:24:20
 0.7               2012-05-01 10:24:23
 0.3               2012-05-01 10:24:26
 0.7               2012-05-01 10:24:29
 0.3               2012-05-01 10:24:32
 0.4               2012-05-01 10:24:35
 0.2               2012-05-01 10:24:38
 0.3               2012-05-01 10:24:41
 0.3               2012-05-01 10:24:44
 0.3               2012-05-01 10:24:47
 0.4               2012-05-01 10:24:50
 0.1               2012-05-01 10:24:53
 0.1               2012-05-01 10:24:56", " {2,}", ";") %>% 
  read_delim(delim = ";", trim_ws = TRUE)

ds2 <-
str_replace_all("jar_no          start_date_time        end_date_time
 1               2012-05-01 10:23:18    2012-05-01 10:23:30
 2               2012-05-01 10:23:31    2012-05-01 10:23:40
 3               2012-05-01 10:23:41    2012-05-01 10:23:52
 4               2012-05-01 10:23:53    2012-05-01 10:24:01
 5               2012-05-01 10:24:02    2012-05-01 10:24:12
 6               2012-05-01 10:24:13    2012-05-01 10:24:20
 7               2012-05-01 10:24:30    2012-05-01 10:23:40
 8               2012-05-01 10:24:41    2012-05-01 10:24:52", " {2,}", ";") %>% 
  read_delim(delim = ";", trim_ws = TRUE)

实际计算:计算行和过滤器的笛卡尔积

crossing(ds1, ds2) %>% 
  filter(date_time >= start_date_time,
         date_time < end_date_time)

但是,结果与您发布的“预期结果”并不完全相同。我不确定我是否误解了或者您的示例是否不正确。例如。我不明白预期结果的第 4 行来自哪里。数据集 2 中似乎没有相应的开始/结束日期。

【讨论】:

  • 感谢您的评论!你是对的,我发布的数字中有一些错误 - 现在应该更正。我尝试使用您的代码,但它没有给我预期的结果 - 见上文
  • 区别在哪里?我只是重新运行它,它似乎正是您现在发布的预期结果。 (当然,列顺序不同,但这很容易调整)。
  • 有些日期时间以错误的间隔结束。无论如何,我最终改为分几个步骤进行计算。首先我使用了setkey,然后通过roll=“nearest”合并了两个数据表。将数据放在一个数据表中,我能够根据时间标准进行索引。不漂亮,但工作。非常感谢您的帮助,我确定您的代码可以正常工作,我只是在使用它时遇到了困难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
相关资源
最近更新 更多