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