2

我有两个数据集,我想根据日期时间信息进行匹配。数据集 1 中的日期时间值表示以给定时间戳结束的 10 分钟时间块。我想将数据集 2 中的每一行与数据集 1 中的 10 分钟时间块(和相关数据)进行匹配。数据示例如下:

Dataset 1
datetime            count
10/11/2012 16:25    231
10/11/2012 16:35    55
10/11/2012 16:45    0
10/11/2012 16:55    30
10/11/2012 17:05    22
10/11/2012 17:15    431
10/11/2012 17:25    455
10/11/2012 17:35    560
10/11/2012 17:45    7
10/11/2012 17:55    36
10/11/2012 18:05    12
10/11/2012 18:15    144
10/11/2012 18:25    583

Dataset 2
datetime            a       n   dpm
10/11/2012 16:26    2.03    27  3473
10/11/2012 17:24    1.35    28  3636
10/11/2012 18:21    7.63    29  3516

我想最终得到如下所示的东西:

datetime2           a       n   dpm     datetime1           count
10/11/2012 16:26    2.03    27  3473    10/11/2012 16:35    55
10/11/2012 17:24    1.35    28  3636    10/11/2012 17:25    455
10/11/2012 18:21    7.63    29  3516    10/11/2012 18:25    583

我知道有诸如 cbind()、rbind() 和 merge() 之类的函数可用于合并数据集(基于我过去提出的一个相关问题:How to merge two data frames in r by a日期/时间值不匹配的公共列),但我无法编写在这种情况下有帮助的代码。我尝试了 cbind(round(data, “mins”)) 和 cbind(trun(data, “hours”)) 的各种组合,但这些函数似乎匹配从数据集 1 到数据集 2 的每一行的多个时间块,而不是不仅仅是每行所在的块。我已经尝试了几个小时来找到一些可以解决这个问题的条件规则,但是没有运气。任何帮助将不胜感激。

4

2 回答 2

2

一种选择是使用通行连接, data.table也称为和最后一个观察结转 (locf)。

library(data.table)
DT  <- data.table(dataset1,key='datetime')
DT1 <- data.table(dataset2,key='datetime')
DT[DT1,roll='nearest']
             datetime count    a  n  dpm
1: 2012-11-10 16:26:00   231 2.03 27 3473
2: 2012-11-10 17:24:00   455 1.35 28 3636
3: 2012-11-10 18:21:00   583 7.63 29 3516

编辑

在这里您可以如何读取数据。通常我使用zooread.zoo或一个技巧是添加一个新的列名,如上:

dat1 <- read.table(text='date time            a       n   dpm
10/11/2012 16:26    2.03    27  3473
10/11/2012 17:24    1.35    28  3636
10/11/2012 18:21    7.63    29  3516',header=TRUE)

dat1$datetime <- as.POSIXct(paste0(dat1$date,dat1$time),
                          format='%d/%m/%Y %H:%M')
     a  n  dpm            datetime
1 2.03 27 3473 2012-11-10 16:26:00
2 1.35 28 3636 2012-11-10 17:24:00
3 7.63 29 3516 2012-11-10 18:21:00
于 2013-06-26T14:42:16.463 回答
2

像这样的东西?

findRow <- function(dt, df) { min(which(df$datetime > dt )) }
rows <- sapply(df2$datetime, findRow, df=df1)
res <- cbind(df2, df1[rows,])

           datetime    a  n  dpm         datetime count
2  10/11/2012 16:26 2.03 27 3473 10/11/2012 16:35    55
7  10/11/2012 17:24 1.35 28 3636 10/11/2012 17:25   455
13 10/11/2012 18:21 7.63 29 3516 10/11/2012 18:25   583

PS1:我认为您的预期结果计数在第 1 行是错误的

PS2:如果您以直接可用的形式提供数据集会更容易。我必须做:

d1 <- 
'datetime            count
10/11/2012 16:25    231
...
'
d2 <- 
'datetime            a       n   dpm
10/11/2012 16:26    2.03    27  3473
10/11/2012 17:24    1.35    28  3636
10/11/2012 18:21    7.63    29  3516
'

.parse <- function(s) {
    cs <- gsub('\\s\\s+', '\t', s)
    read.table(text=cs, sep="\t", header=TRUE, stringsAsFactors=FALSE)
}

df1 <- .parse(d1)
df2 <- .parse(d2)
于 2013-06-26T15:41:57.687 回答