gpt4 book ai didi

r - 每隔n分钟与dplyr分组

转载 作者:行者123 更新时间:2023-12-03 20:14:26 24 4
gpt4 key购买 nike

我有一个数据集,其中包含在给定日期的特定时间发生的10个事件,每个事件具有对应的值:

d1 <- data.frame(date = as.POSIXct(c("21/05/2010 19:59:37", "21/05/2010 08:40:30", 
"21/05/2010 09:21:00", "21/05/2010 22:29:50", "21/05/2010 11:27:34",
"21/05/2010 18:25:14", "21/05/2010 15:16:01", "21/05/2010 09:41:53",
"21/05/2010 15:01:29", "21/05/2010 09:02:06"), format ="%d/%m/%Y %H:%M:%S"),
value = c(11313,42423,64645,643426,1313313,1313,3535,6476,11313,9875))


我想以标准数据帧格式(从“ 21/05/2010 00:00:00”到“ 21/05/2010 23:57:00”)每3分钟汇总一次结果,以便该数据帧具有480个bin每个3分钟)

首先,我创建一个数据框,每个框包含3分钟的时间:

d2 <- data.frame(date = seq(as.POSIXct("2010-05-21 00:00:00"), 
by="3 min", length.out=(1440/3)))


然后,我将两个数据帧合并在一起并删除NA:

library(dplyr)
m <- merge(d1, d2, all=TRUE) %>% mutate(value = ifelse(is.na(value),0,value))


最后,我使用 period.apply()包中的 xts求和每个bin的值:

library(xts)
a <- period.apply(m$value, endpoints(m$date, "minutes", 3), sum)


有更有效的方法吗?感觉并不理想。

更新#1

我在约书亚回答后调整了代码:

library(xts)
startpoints <- function (x, on = "months", k = 1) {
head(endpoints(x, on, k) + 1, -1)
}

m <- seq(as.POSIXct("2010-05-21 00:00:00"), by="3 min", length.out=1440/3)
x <- merge(value=xts(d1$value, d1$date), xts(,m))
y <- period.apply(x, c(0,startpoints(x, "minutes", 3)), sum, na.rm=TRUE)


我不知道 na.rm=TRUE可以与 period.apply()一起使用,现在允许我跳过 mutate(value = ifelse(is.na(value),0,value))。这是向前迈出的一步,我对这里的 xts方法很满意,但我想知道在这种情况下是否可以使用纯 dplyr解决方案。

更新#2

在尝试Khashaa的答案后,我遇到了错误,因为未指定我的时区。所以我有:

> tail(d4)
interval sumvalue
476 2010-05-21 23:45:00 NA
477 2010-05-21 23:48:00 NA
478 2010-05-21 23:51:00 NA
479 2010-05-21 23:54:00 NA
480 2010-05-21 23:57:00 11313
481 2010-05-22 02:27:00 643426
> d4[450,]
interval sumvalue
450 2010-05-21 22:27:00 NA


现在,在 Sys.setenv(TZ="UTC")之后,一切正常。

最佳答案

lubridate-dplyr式解决方案。

library(lubridate)
library(dplyr)
d2 <- data.frame(interval = seq(ymd_hms('2010-05-21 00:00:00'), by = '3 min',length.out=(1440/3)))
d3 <- d1 %>%
mutate(interval = floor_date(date, unit="hour")+minutes(floor(minute(date)/3)*3)) %>%
group_by(interval) %>%
mutate(sumvalue=sum(value)) %>%
select(interval,sumvalue)
d4 <- merge(d2,d3, all=TRUE) # better if left_join is used
tail(d4)
# interval sumvalue
#475 2010-05-21 23:42:00 NA
#476 2010-05-21 23:45:00 NA
#477 2010-05-21 23:48:00 NA
#478 2010-05-21 23:51:00 NA
#479 2010-05-21 23:54:00 NA
#480 2010-05-21 23:57:00 NA
d4[450,]
# interval sumvalue
#450 2010-05-21 22:27:00 643426


如果您习惯使用 Date(我不是),则可以省去 lubridate,然后将最终合并替换为 left_join

关于r - 每隔n分钟与dplyr分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27594959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com