【发布时间】:2017-05-05 14:00:34
【问题描述】:
我有两个数据框:“探针”和“事件”。下面的代码将生成这些数据帧的可重现样本。 Probes.subset 是来自 Probes 的所有观测值的数据框,这些观测值与事件中的日期时间范围相交。 下面的代码将生成 6 个事件...实际上我有近 200 个离散事件。
目标:我需要将Events中的Event.name加入到基于Timestamp的Probes.subset中的每个对应观察中,以便每个观察都与正确的事件相关联。
我have previously tried a FOR loop 但这非常慢并且由于我的数据超过 180,000 行而无法完成。我有一种感觉,这可以通过编写一个函数并使用类似 apply 的东西来解决,但我是 R 函数的新手,我创建的函数都没有。
library(dplyr)
# Generate Probes data
start <- as.POSIXct("01/06/2016 01:00", format = "%d/%m/%Y %H:%M")
end <- start + as.difftime(1, units = "days")
Timestamp <- seq(from = start, to = end, by = "10 mins")
Value <- round(runif(145) * 100, 2)
Probes <- data.frame(Timestamp, Value)
# Generate Events data
Event.name <- seq(1, 6)
Event.start <- as.POSIXct(c("01/06/2016 01:20", "01/06/2016 05:00",
"01/06/2016 06:30", "01/06/2016 12:00",
"01/06/2016 17:40", "01/06/2016 19:20"),
format = "%d/%m/%Y %H:%M")
Event.end <- as.POSIXct(c("01/06/2016 02:00", "01/06/2016 05:30",
"01/06/2016 07:20", "01/06/2016 14:00",
"01/06/2016 18:10", "01/06/2016 21:40"),
format = "%d/%m/%Y %H:%M")
Events <- data.frame(Event.name, Event.start, Event.end)
# Subset probes data to fall within Events bounds
Probes.subset <- Probes %>%
mutate(InRange = Timestamp %in% unlist(Map(
`:`,
Events$Event.start,
Events$Event.end
))) %>%
filter(InRange == "TRUE")
【问题讨论】:
-
A similar question 处理加入日期范围,但他们的示例在数据框之间有一个公共列。我无法评论他们的问题,因为我的代表太低了。
-
这会产生你想要的结果吗?
unlist(lapply(Probes.subset$Timestamp, function(x) which(x >= Events$Event.start & x <= Events$Event.end)))。您可以将其分配给Probes.subset中的列 -
@Gopala - 我尝试运行它但得到以下错误:
Error in$(*tmp*, "Event", value = c(1L, 1L, 1L, 1L, : replacement has 43 rows, data has 54 -
是的 - 对不起。代替
unlist,使用as.integer。它将正确填充缺失值。as.integer(lapply(Probes.subset$Timestamp, function(x) which(x >= Events$Event.start & x <= Events$Event.end, arr.ind = TRUE))).