我有两个数据框,一个包含测量值和一个时间戳,另一个包含带有开始和结束时间的测量周期:
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循环,但我正在寻找一种更有效的方法。
答案 0 :(得分:1)
使用sapply
的基础R方法。对于datetime
的{{1}}列中的每个值,我们会检查它是否属于d1
中任何行的范围。如果它落在d2
行的范围内,则返回相应的any
值,否则返回mp
。
NA
答案 1 :(得分:1)
不确定这是否是最有效的方式,但我这样做的方法是首先将int()
转换为列表(每行是一个列表条目),然后通过列表进行lapply分配正确的d2
到mp
:
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
)
赋值运算符。您还将在控制台中打印一些不相关的内容,但<<-
将按预期进行修改。