R中两个标准的循环
我有一个像这样的数据框R中两个标准的循环,r,R,我有一个像这样的数据框 Spot_Datetime State ---------- ------ 2016-01-02 08:00 CA 2016-01-02 08:03 AZ Datetime State Sessions ---------- ------ ----------- 2016-01-02 08:01 CA 1 2016-01-02 08:02 CA 4 2016
Spot_Datetime State
---------- ------
2016-01-02 08:00 CA
2016-01-02 08:03 AZ
Datetime State Sessions
---------- ------ -----------
2016-01-02 08:01 CA 1
2016-01-02 08:02 CA 4
2016-01-02 08:03 CA 3
2016-01-02 08:03 AZ 9
我有另一个数据框,看起来像这样
Spot_Datetime State
---------- ------
2016-01-02 08:00 CA
2016-01-02 08:03 AZ
Datetime State Sessions
---------- ------ -----------
2016-01-02 08:01 CA 1
2016-01-02 08:02 CA 4
2016-01-02 08:03 CA 3
2016-01-02 08:03 AZ 9
我目前有一个循环,它从第一个数据集中对特定时间窗口的会话进行求和,但我希望它在状态和日期上匹配。我在R怎么做
理想情况下,我的数据帧将如下所示(例如,一个10分钟的窗口):
我有一个上下窗口循环,我可以在外循环上使用If语句吗
资料
d1这里是一个使用dplyr
包而不是循环的解决方案。首先,定义时间窗口是什么。其次,根据Datetime列将数据剪切到windows中。(我使用了10分钟的窗口,因此您提供的数据只能“剪切”到单个窗口中,但这应该可以在更长的时间内处理更多数据。)最后,按日期时间和状态对数据进行分组,并对每组中的会话进行求和
# (Read in your d2 data)
# get 10-min cut points
start <- as.POSIXct("2016-01-02 08:00") #Set beginning of first window in data
end <- as.POSIXct("2016-01-02 08:10") #Set end of last window in data
winsize <- 60*10 # set window size in seconds
winbreaks <- seq(start, end, by=winsize)
# Cut the data based on the windows,
# group it by window and State,
# then sum Sessions within each group
results <- data %>% mutate(window=cut(Datetime, breaks=winbreaks)) %>%
group_by(window, State) %>%
summarise(tot.sessions=sum(Sessions))
#(读入d2数据)
#获得10分钟的切点
开始您只需要按状态按间隔分组进行聚合,并使用您熟悉的任何方法。这里是基地
d1 <- read.table(header = TRUE, text = "Spot_Datetime State
'2016-01-02 08:00' CA
'2016-01-02 08:03' AZ", colClasses = c('POSIXct','character'))
d2 <- read.table(header = TRUE, text = "Datetime State Sessions
'2016-01-02 08:01' CA 1
'2016-01-02 08:02' CA 4
'2016-01-02 08:03' CA 3
'2016-01-02 08:03' AZ 9", colClasses = c('POSIXct','character','integer'))
现在就按州来做。唯一的技巧是匹配d1
中的哪些字段将与d2
window <- 10
d3 <- merge(d2, d1, sort = FALSE)
d3$idx <- ave(1:nrow(d3), d3$State, FUN = function(x)
findInterval(d3$Datetime[x], unique(d3$Spot_Datetime[x]) + seq(0, 60, window) * 60))
(d4 <- aggregate(Sessions ~ State + idx, d3, sum))
# State idx Sessions
# 1 AZ 1 9
# 2 CA 1 8
merge(d1, d4[, c('State','Sessions')], sort = FALSE)
# State Spot_Datetime Sessions
# 1 CA 2016-01-02 08:00:00 8
# 2 AZ 2016-01-02 08:03:00 9
窗口提供了一个很好的进入dplyr的入口点,您可以查看它的
window <- 10
d3 <- merge(d2, d1, sort = FALSE)
d3$idx <- ave(1:nrow(d3), d3$State, FUN = function(x)
findInterval(d3$Datetime[x], unique(d3$Spot_Datetime[x]) + seq(0, 60, window) * 60))
(d4 <- aggregate(Sessions ~ State + idx, d3, sum))
# State idx Sessions
# 1 AZ 1 9
# 2 CA 1 8
merge(d1, d4[, c('State','Sessions')], sort = FALSE)
# State Spot_Datetime Sessions
# 1 CA 2016-01-02 08:00:00 8
# 2 AZ 2016-01-02 08:03:00 9