Seite 1 von 1

spaltenweise Berechnung (for-Schleife, Indizierung oder apply oder andere Idee?)

Verfasst: So Aug 12, 2018 9:20 am
von fablink
Hallo zusammen,

ich hänge gerade an folgender Kleinigkeit und bin sicher, es gibt ne relativ einfache Lösung, auf die ich aber gerade nicht komme.
Meine Daten sind in einer Tabelle, in der ich einen Spaltenname habe, dann habe ich eine Zeitreihe in 15-Minutenintervallen in Spalten für ein Jahr. Also Variablen (Standorte) in Spalten, Werte in Zeilen in 15 Minuten-Schritten. Vorne dran habe ich eine eine "Stunden"-Variable erstellt und drangeheftet:

Code: Alles auswählen

stunden <- sort(rep(1:8784,4))
y<- cbind(stunden, x)
Ich möchte daraus stündliche Werte basteln, also immer 4 Werte zusammenfassen, was ich für eine Spalte mit dem dplyr-Paket und folgenden Zeilen gelöst habe:

Code: Alles auswählen

Ausgabe<- y %>%
  group_by(stunden) %>%
  summarise(avg = mean(y$spalte2))
Damit bekomme ich den Vektor mit den Stundenwerten für eine Spalte. (Soweit, so gut!)
Theoretisch könnte ich das natürlich jetzt händisch so weiterführen und mit allem mal durchgehen, eleganter (und schneller... ich habe viele Spalten) wäre aber, das nun "automatisch" für alle Spalten zu machen. Ich habe ein bisschen herumprobiert mit einer funktion, for-Schleifen etc., aber ich kriege es nicht hin. (Bzw. ich habe auch schon überlegt, aus der Tabelle einen langen Vektor zu machen, das Mittel zu berechnen und wieder zu ner Matrix zusammenzufügen, aber das ist irgendwie ja auch Pfuscherei, gerade mit R muss das doch irgendwie geschickt gehen?)

Danke schonmal für Anregungen und Ideen

Re: spaltenweise Berechnung (for-Schleife, Indizierung oder apply oder andere Idee?)

Verfasst: So Aug 12, 2018 9:52 am
von EDi
Um im tidyverse zu bleiben:

Code: Alles auswählen

Ausgabe<- y %>%
  group_by(stunden) %>%
  summarise_all(funs(mean))
summarise_at und summarise_if können auch hilfreich sein, falls du nicht alle Spalten aggregieren willst.

Re: spaltenweise Berechnung (for-Schleife, Indizierung oder apply oder andere Idee?)

Verfasst: So Aug 12, 2018 10:00 am
von jogo
Hallo Fablink,

willkommen im Forum!
fablink hat geschrieben: So Aug 12, 2018 9:20 am

Code: Alles auswählen

stunden <- sort(rep(1:8784,4))
y<- cbind(stunden, x)
Wenn Du bei rep() die Parameter etwas anders wählst, musst Du nicht sortieren:

Code: Alles auswählen

stunden <- rep(1:8784, each=4)
Ich möchte daraus stündliche Werte basteln, also immer 4 Werte zusammenfassen, was ich für eine Spalte mit dem dplyr-Paket und folgenden Zeilen gelöst habe:

Code: Alles auswählen

Ausgabe<- y %>%
  group_by(stunden) %>%
  summarise(avg = mean(y$spalte2))
Damit bekomme ich den Vektor mit den Stundenwerten für eine Spalte. (Soweit, so gut!)
Leider kenne ich mich im dplyr-Universum nicht so gut aus.
In base R sieht das so aus:

Code: Alles auswählen

aggregate(as.matrix(iris[-5]) ~ iris$Species, FUN=mean)
also für Dich

Code: Alles auswählen

aggregate(as.matrix(x) ~ stunden, FUN=mean)
Mit data.table sieht es so aus:

Code: Alles auswählen

library("data.table")
setDT(y)
y[, lapply(.SD, mean), stunden]
Bei dplyr schau mal nach der Funktion summarise_all() https://rdrr.io/cran/dplyr/man/summarise_all.html

Gruß, Jörg

Re: spaltenweise Berechnung (for-Schleife, Indizierung oder apply oder andere Idee?)

Verfasst: So Aug 12, 2018 1:41 pm
von fablink
Hey Jogo und Edi,

Ihr seid großartig und ich stand echt nur auf dem Schlauch. Wenn ich "summarise" durch "summarise_all" ersetze (in obigen kleinem codeschnipsel), dann passts perfekt! :oops: :roll:

Und danke für das herzliche Willkommen!
Ich bin hier eigenltich noch angemeldet (fablink26 glaube ich), aber weiß mein Passwort nicht mehr und an die E-Mail komm ich nicht mehr ran, daher habe ich mich geschwind nochmal angemeldet (grrrr, sorry)

You made my day! Ich bekomm das grinsen grade nicht mehr aus dem Gesicht, Ihr habt mir superklasse geholfen!
Danke, danke, danke, danke, danke!

Viele Grüße
Fabian

Re: spaltenweise Berechnung (for-Schleife, Indizierung oder apply oder andere Idee?)

Verfasst: So Aug 12, 2018 4:48 pm
von bigben
fablink26 scheint es hier nicht zu geben.
LG, Bernhard