r - 使用时间间隔计算另一个数据帧的平均值

标签 r datetime mean

我有两个数据框。一个数据帧包含一网组(开始)和一举(结束)的时间。我需要使用这个时间段来计算第二个数据帧的平均 DO。我在匹配时间时遇到问题,因为 catch 数据框中的时间是特定的,而 DO 数据框中的时间是每小时。我尝试匹配最接近的时间,但无法做到这一点,所以我的下一个想法是只使用时间间隔内的任何内容。平均值需要特定于时间间隔内的船和网。我正在对几个非常大的数据集执行此操作,因此我需要能够循环该函数而不是为每一行编写代码。

catchdf:

Boat    Net   Set                    Lift
Dawn    26    2016-05-19 12:20:11    2016-05-27 11:48:36
Nip     26    2016-07-28 07:25:47    2016-08-07 06:13:10
Dawn    26.3  2016-08-01 13:24:51    2016-08-03 07:48:52

多夫:

time                   DO      Boat    Net
2016-05-19 13:00:00    10.2    Dawn    26
2016-05-21 15:00:00    10.4    Dawn    26
2016-05-26 09:00:00    10.9    Dawn    26
2016-05-28 10:00:00    9.4     Dawn    26
2016-07-28 09:00:00    11.9    Nip     26
2016-07-28 19:00:00    12.4    Nip     26
2016-08-04 04:00:00    5.4     Nip     26
2016-08-01 05:00:00    13.2    Dawn    26.3
2016-08-02 16:00:00    12.3    Dawn    26.3
2016-08-05 22:00:00    2.4     Dawn    26.3

我的目标是在 catchdf 中插入一列,其中包含每个时间段的meanDO。

Boat    Net   Set                    Lift                  MeanDO
Dawn    26    2016-05-19 12:20:11    2016-05-27 11:48:36   10.50
Nip     26    2016-07-28 07:25:47    2016-08-07 06:13:10   9.90
Dawn    26.3  2016-08-01 13:24:51    2016-08-03 07:48:52   12.3

这是我用来制作示例数据框的代码:

catchdf <- structure(list(Boat = c("Dawn", "Nip", "Dawn"), Net = c("26", "26", "26.3"), Set = c("2016-05-19 12:20:11", "2016-07-28 07:25:47", "2016-08-01 13:24:51"), Lift = c("2016-05-27 11:48:36", "2016-08-07 06:13:10", "2016-08-03 07:48:52")), .Names = c("Boat", "Net", "Set", "Lift"), class = "data.frame", row.names = c(NA, -3L))

dodf <- structure(list(time = c("2016-05-19 13:00:00", "2016-05-21 15:00:00", "2016-05-26 09:00:00", "2016-05-28 10:00:00", "2016-07-28 09:00:00", "2016-07-28 19:00:00", "2016-08-04 04:00:00", "2016-08-01 05:00:00", "2016-08-02 16:00:00", "2016-08-05 22:00:00"), DO = c("10.2", "10.4", "10.9", "9.4", "11.9", "12.4", "5.4", "13.2", "12.3", "2.4"), Boat = c("Dawn", "Dawn", "Dawn", "Dawn", "Nip", "Nip", "Nip", "Dawn", "Dawn", "Dawn"), Net = c("26", "26", "26", "26", "26", "26", "26", "26.3", "26.3", "26.3")), .Names = c("time", "DO", "Boat", "Net"), class = "data.frame", row.names = c(NA, -10L))

我在这个问题上已经坚持了一段时间了,但没有取得任何进展。任何帮助将不胜感激。

最佳答案

这是可能的 data.table 解决方案。首先,我们将修复您的列的格式

library(data.table) #v1.10.4
cols <- c("Set", "Lift")
setDT(catchdf)[, (cols) := lapply(.SD, as.POSIXct), .SDcols = cols]
setDT(dodf)[, `:=`(time = as.POSIXct(time), DO = as.numeric(DO))]

然后我们可以在数据集之间进行非等值连接,同时计算平均值

dodf[catchdf, .(MeanDO = mean(DO)), on = .(Boat, Net, time > Set, time < Lift), by = .EACHI]
#    Boat  Net                time                time MeanDO
# 1: Dawn   26 2016-05-19 12:20:11 2016-05-27 11:48:36   10.5
# 2:  Nip   26 2016-07-28 07:25:47 2016-08-07 06:13:10    9.9
# 3: Dawn 26.3 2016-08-01 13:24:51 2016-08-03 07:48:52   12.3

关于r - 使用时间间隔计算另一个数据帧的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43238976/

相关文章:

javascript - 在服务器或 SPA 处理搜索功能?

r - `mean` 没有产生正确答案

r - 使用 sourceCpp() 的 Rcpp 和 RcppArmadillo 在 R 中出错

Python:以另一列为条件的数据框中列表的逐元素平均值

r - 如何在 R Markdown 中使用 Cairo PNG

python - Pandas:按月份划分的词频

Python 日期时间转换

c# - 如何将 WCF 样式格式的日期字符串(即 "/Date(1342210377000)/")转换为 c# DateTime?

r - 如何根据置信区间 R 对 ggplot 2 中的点进行着色

r - 在 R 中通过 ID 进行最后的观察