我有一个在不同时间段发生的不同事件的数据集。
我想计算每个事件跨越每月的天数。
这是数据框。
dat = structure(list(event = structure(c(2L, 1L, 2L, 1L, 3L, 1L, 3L,
1L, 2L, 1L, 3L, 1L, 2L, 1L, 1L, 1L, 3L, 1L, 1L, 2L), .Label = c("Event1",
"Event2", "Event3"), class = "factor"), startDateTime = structure(c(1370995200,
1370649600, 1370476800, 1370304000, 1370131200, 1370131200, 1370044800,
1368316800, 1366848000, 1363824000, 1363737600, 1363046400, 1363046400,
1362873600, 1362009600, 1360627200, 1357776000, 1357689600, 1357689600,
1356739200), tzone = "UTC", class = c("POSIXct", "POSIXt")),
endDateTime = structure(c(1371686400, 1371686400, 1370908800,
1370476800, 1370649600, 1370131200, 1370476800, 1368489600,
1366934400, 1364083200, 1366502400, 1363219200, 1365897600,
1363219200, 1362182400, 1363132800, 1360454400, 1357776000,
1357862400, 1356998400), tzone = "UTC", class = c("POSIXct",
"POSIXt"))), .Names = c("event", "startDateTime", "endDateTime"
), row.names = c(NA, -20L), class = "data.frame")
我从搜索中发现,我可以使用动物园包计算每个月的事件天数,如下:
library(zoo)
table(as.yearmon(seq(dat$startDateTime[20], dat$endDateTime[20], "day")))
Dec 2012 Jan 2013
3 1
我想扩展和概括这一点,以便我可以将它应用于整个 数据帧并计算每个事件每个事件跨越不同事件的天数。这是使用lubridate可以实现的吗?
对此的任何指示都将非常感激。
答案 0 :(得分:1)
使用其主体几乎是您的代码的函数在行索引上尝试nr <- nrow(dat)
result <- lapply(1:nr, function(i)
table(as.yearmon(seq(dat$startDateTime[i], dat$endDateTime[i], "day")))
)
。它将生成一个每行包含一个组件的列表:
nr <- nrow(dat)
L <- lapply(1:nr, function(i) {
tab <- table(as.yearmon(seq(dat$startDateTime[i], dat$endDateTime[i], "day")))
data.frame(Row = i, tab)
})
do.call("rbind", L)
或生成data.frame输出:
{{1}}
答案 1 :(得分:1)
你可以尝试
library(data.table)
library(lubridate)
library(zoo)
setDT(dat)[, list(as.yearmon(seq(min(startDateTime), max(endDateTime),
by='day'))) , event][, .N, list(event, V1)]