2017-07-07 49 views
1

介紹「好」遊:一個分組數據框的時間用dplyr

我想大約5分鐘的數據聚合成10分鐘數據。具體來說,我只想彙總10分鐘的標記(00:10:00,00:20:00,00:30:00等)。

下面的代碼幾乎可以達到此目的,但休息時間爲5分鐘而非10分鐘時間(00:05:00,00:15:00,00:25:00)。我認爲dplyr在確定分界點時正在使用數據框中的第一行。

有什麼方法可以使用cut {base}group_by() {dplyr}來實現「漂亮」的10分鐘休息嗎?我只需刪除第一行數據即可,但我確實需要解決方案來管理許多不同的文件,每個文件都有獨特的起點。

提前致謝!

例如代碼:

date <- c("2017-06-14 14:35:00", "2017-06-14 14:40:00", "2017-06-14 14:45:00", "2017-06-14 14:50:00") 
co <- as.numeric(c(5.17,10.07,13.88,13.78)) 
no <- as.numeric(c(34.98,32.45,31.34,29.09)) 
no2 <- as.numeric(c(0.00,0.00,0.00,0.00)) 
o3 <- as.numeric(c(5.17,10.07,13.88,13.78)) 

data <- data.frame(date, co, no , no2, o3) 
data$date <- strptime(data$date, format = "%Y-%m-%d %H:%M") 
data$date <- as.POSIXct(data$date) 

head(data) 

data_10min <- data %>% 
     group_by(date = cut(date, breaks = "10 min")) %>% 
     summarize(co = mean(co), no = mean(no), no2 = mean(no2), o3 = mean(o3)) 

head(data_10min) 

所需的輸出:

2017-06-14 14:40:00 
2017-06-14 14:50:00 

回答

1

期間group_by只是加入300秒至日期列獲得所希望的結果。

library(magrittr) 
library(dplyr) 

df_10min <- df %>% 
    group_by(date = cut(as.POSIXct(x) + 300, breaks = "10 min")) %>% 
    summarize_each(funs(mean)) 

df_10min 

結果:

# # A tibble: 2 × 5 
# date co  no no2 o3 
# <fctr> <dbl> <dbl> <dbl> <dbl> 
# 1 2017-06-14 14:40:00 7.62 33.715  0 7.62 
# 2 2017-06-14 14:50:00 13.83 30.215  0 13.83 
+0

謝謝!這足以滿足我需要做的事情。 – spacedSparking