按开始和结束时间匹配数据

时间:2017-06-21 09:33:03

标签: r dataframe

我有两个数据框,一个包含测量值和一个时间戳,另一个包含带有开始和结束时间的测量周期:

txt1 <- "     v1     datetime
23 '2016-02-14 12:00:10'
12 '2016-02-14 12:03:10'
21 '2016-02-14 12:50:00'
52 '2016-02-14 13:01:10'
53 '2016-02-14 13:05:50'
23 '2016-02-14 13:09:25'
95 '2016-02-14 13:20:10'
11 '2016-02-14 13:21:00'
64 '2016-02-14 13:25:12'
41 '2016-02-14 13:45:34'
14 '2016-02-14 13:53:08'
"

txt2 <- "    mp     start     end
1 '2016-02-14 12:00:00' '2016-02-14 12:11:00'
2 '2016-02-14 12:58:00' '2016-02-14 13:13:00'
3 '2016-02-14 13:22:00' '2016-02-14 14:00:00'
"
d1 <- read.table(textConnection(txt1), header = TRUE,
                 colClasses = c("integer", "POSIXct"))

d2 <- read.table(textConnection(txt2), header = TRUE,
                 colClasses = c("integer", "POSIXct" ,"POSIXct"))

我想为每次测量分配正确的测量周期(保留不匹配的行):

"     v1     datetime     mp
23 '2016-02-14 12:00:10' 1
12 '2016-02-14 12:03:10' 1
21 '2016-02-14 12:50:00' NA
52 '2016-02-14 13:01:10' 2
53 '2016-02-14 13:05:50' 2
23 '2016-02-14 13:09:25' 2
95 '2016-02-14 13:20:10' NA
11 '2016-02-14 13:21:00' NA
64 '2016-02-14 13:25:12' 3
41 '2016-02-14 13:45:34' 3
14 '2016-02-14 13:53:08' 3
"

我目前的方法是使用嵌套的for循环,但我正在寻找一种更有效的方法。

2 个答案:

答案 0 :(得分:1)

使用sapply的基础R方法。对于datetime的{​​{1}}列中的每个值,我们会检查它是否属于d1中任何行的范围。如果它落在d2行的范围内,则返回相应的any值,否则返回mp

NA

答案 1 :(得分:1)

不确定这是否是最有效的方式,但我这样做的方法是首先将int()转换为列表(每行是一个列表条目),然后通过列表进行lapply分配正确的d2mp

d1

请注意apply函数中的d1$mp <- NA d2_list <- split(d2, seq(nrow(d2))) lapply( d2_list, function(row) d1$mp[d1$datetime >= row$start & d1$datetime <= row$end] <<- row$mp ) 赋值运算符。您还将在控制台中打印一些不相关的内容,但<<-将按预期进行修改。