【发布时间】: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 中的按范围合并 - stackoverflow.com/q/11892241/10488504 或 R 中的匹配范围合并 - stackoverflow.com/q/11851240/10488504。