2017-08-12 2 views
0

Ich habe diese Daten eingestellt, dass sie in 30-Minuten-Schritt aufgezeichnet:R - Aggregat 30-min Datenrahmen zu stündlichen Datenrahmen?

structure(list(Particles = c(0.596667, 0.27, 0.153333, 0, 0.753333, 
    0, 0.35, 0.506667, 1.6, 0.116667), PM = c(35.5158928571429, 16.0714285714286, 
    9.12696428571429, 0, 44.84125, 0, 20.8333333333333, 30.15875, 
    95.2380952380953, 6.94446428571429), timestamp = c(1493310389147, 
    1493310419191, 1493310449254, 1493310479270, 1493310509313, 1493310539387, 
    1493310569416, 1493310599465, 1493310629525, 1502378711339), 
     date = structure(c(1493310389.147, 1493310419.191, 1493310449.254, 
     1493310479.27, 1493310509.313, 1493310539.387, 1493310569.416, 
     1493310599.465, 1493310629.525, 1502378711.339), class = c("POSIXct", 
     "POSIXt"), tzone = "UTC-1"), site = c("ABC", "ABC", 
     "ABC", "ABC", "ABC", "ABC", 
     "ABC", "ABC", "ABC", "ABC" 
     ), code = c("ABC", "ABC", "ABC", 
     "ABC", "ABC", "ABC", "ABC", 
     "ABC", "ABC", "ABC"), key_date = c("2017-04-27", 
     "2017-04-27", "2017-04-27", "2017-04-27", "2017-04-27", "2017-04-27", 
     "2017-04-27", "2017-04-27", "2017-04-27", "2017-08-10")), .Names = c("Particles", 
    "PM", "timestamp", "date", "site", "code", "key_date"), row.names = c(NA, 
    10L), class = "data.frame") 

Wie kann ich es stündlichen Schritt aggregieren? Meine Spalten variieren von einem Datenrahmen zum anderen, so dass ich eine Möglichkeit brauche, sie zu aggregieren, damit sie auch auf andere Datenrahmen angewendet werden kann.

EDIT:

Ich versuchte es mit:

res <- aggregate(Df['PM'], list(date = cut(as.POSIXct(Df$date), "1 hour")), sum) 

Aber dies nur lässt mich zwei Spalten, der Rest weg. Wie kann ich halten sie halten?

+1

Wie wäre es mit 'cut' dh' df1 %>% group_by (Stunde = Schnitt (Datum, Pausen = "Stunde"))%>% Zusammenfassung (PM = Summe (PM)) ' – akrun

+0

@akrun Wie mache ich das? Ich bekomme diesen Fehler 'Warnung: Fehler in%>%: konnte die Funktion"%>% "nicht finden' ' – laukok

+1

Ich nahm an, dass du' library (dplyr); df1%>% group_by (.. ' – akrun

Antwort

2

Wir können cut verwenden, um die Stundengruppenvariable zu erstellen und dann summarise

library(dplyr) 
df1 %>% 
    group_by(Hour = cut(date, breaks = "hour")) %>% 
    summarise(PM = sum(PM)) 

Wir haben auch eine Funktion erstellen, können die Gruppierungsspalten und die Spalten passieren summarise

fSumm <- function(dat, dateVar, groupVars, colstoSumm){ 
     dat %>% 
      group_by(Hour = cut(!! rlang::sym(dateVar), breaks = "hour")) %>% 
      group_by(!!! rlang::syms(groupVars), add = TRUE) %>% 
      summarise_at(vars(colstoSumm), sum) 
    } 

groups <- c("site", "code") 
cols <- c("Particles", "PM") 
dateV <- "date" 
fSumm(df1, dateV, groups, cols) 
sein

Wir können auch dieverwendenRoute

fSumm <- function(dat, dateVar, groupVars, colstoSumm){ 
    cols <- sapply(colstoSumm, quo_name) 

    dat %>% 
     group_by(Hour = cut(!! dateVar, breaks = "hour")) %>% 
     group_by(!!! groupVars, add = TRUE) %>% 
     summarise_at(vars(cols), sum) 
} 

fSumm(df1, quo(date), quos(site, code), quos(Particles, PM)) 
+0

Entschuldigung, ich habe die Daten überprüft es macht keinen Unterschied tatsächlich ... – laukok

+0

@teelou Sie müssen die Ausgabe auf ein Objekt zuweisen, dh' res <- df1 %>% group_by ... 'Wenn dies eine Spalte im ursprünglichen Dataset sein muss, dann' df1 <- df1 %>% group_by (....)%>% muate (PMSum = Summe (PM)) ' – akrun

+0

Verstanden gibt mir nur zwei Spalten, die PM und Hour sind, der Rest meiner Spalten ist weg.Wie kann ich sie behalten? – laukok

1

Wir versuchen:

library(data.table) 
setDT(df) 
varsToSum <- c("PM", "Particles") 
df[, lapply(.SD[, ..varsToSum], sum), by = format(date, "%Y-%m-%d-%H")] 

      format   PM Particles 
1: 2017-04-27-17 251.785714 4.230000 
2: 2017-08-10-16 6.944464 0.116667 

, die wir leicht erweitern können den ersten Wert der restlichen Variablen enthalten:

cbind(
    df[, lapply(.SD[, ..varsToSum], sum), by = format(date, "%Y-%m-%d-%H")] 
    , df[, lapply(.SD[, !(names(df) %in% varsToSum), with = FALSE], head, 1), 
    by = format(date, "%Y-%m-%d-%H")][, -"format"] 
) 

      format   PM Particles timestamp site code key_date 
1: 2017-04-27-17 251.785714 4.230000 1.493310e+12 ABC ABC 2017-04-27 
2: 2017-08-10-16 6.944464 0.116667 1.502379e+12 ABC ABC 2017-08-10