考虑以下DataSet;
scd <- read.table(text = "
2019-04-01 10:00:00 | 2019-04-01 12:00:00 | 10
2019-04-02 10:00:00 | 2019-04-02 12:00:00 | 5
2019-04-03 13:00:00 | 2019-04-03 15:00:00 | 7
2019-04-04 16:00:00 | 2019-04-04 19:00:00 | 5
2019-04-05 10:00:00 | 2019-04-05 12:00:00 | 6
2019-04-06 10:00:00 | 2019-04-06 12:00:00 | 5", sep = "|")
colnames(scd) <- c('start_date_ts', 'end_date_ts', 'people_count')
上面的代码包括开始日期和结束日期与时间,假设对于每小时,我可以预期人数统计列中提到的计数增加。
例如,从第1行开始,它表示从上午10点到下午12点,我可以预计计数会增加10。
2019-04-01 10:00:00 = 10 +实际数据
2019-04-01 11:00:00 = 10 +实际数据
2019-04-01 12:00:00 = 10 +实际数据
实际数据;
fc_data <- read.table(text = "
2019-04-01 10:00:00 | 10
2019-04-01 12:00:00 | 5
2019-04-04 19:00:00 | 5
2019-04-05 12:00:00 | 6
2019-04-06 08:00:00 | 3", sep = "|")
colnames(fc_data) <- c('pred_t', 'fpc')
我期待以下结果; (来自fc_data)
第1 - 10行+ 10 = 20
第2行 - 5 + 10 = 15
第3 - 5 + 5行= 10
第4 - 6 + 6行= 12
第5 - 3行+ 0 = 3
我希望代码遍历每一行并与开始和结束时间匹配,并为我提供上面提供的输出。
我的方法;
fc_data$events_pc <- with(fc_data, ifelse(fc_data$pred_t == scd$start_date_ts | fc_data$pred_t == scd$end_date_ts &
fc_data$pred_t == scd$end_date_ts,
fc_data$fpc + scd$people_count, fc_data$fpc + 0))
虽然,我添加了一些行,但其他行实际上并不匹配。我在Stack上搜索了一些信息,但是,我找不到任何信息。任何输入都将非常有用。
我们可以使用mapply
并将来自start_date_ts
的end_date_ts
和scd
与pred_t
相匹配,获得相应的people_count
并将其添加到fpc
。
mapply(function(x, y) {
inds <- x >= scd$start_date_ts & x <= scd$end_date_ts
if (any(inds))
y + scd$people_count[inds]
else
y
}, fc_data$pred_t, fc_data$fpc)
#[1] 20 15 10 12 3
确保日期时间变量采用POSIXct
格式,如果不是,则需要更改它们。
fc_data$pred_t <- as.POSIXct(fc_data$pred_t)
scd[1:2] <- lapply(scd[1:2], as.POSIXct)