wake-up-neo.com

Mehrere Variablen pro Gruppe zusammenfassen/zusammenfassen (z. B. Summe, Mittelwert)

Gibt es in einem Datenrahmen eine einfache Möglichkeit, mehrere Variablen gleichzeitig zu aggregieren (sum, mean, max et c)?

Nachfolgend einige Beispieldaten:

library(lubridate)
days = 365*2
date = seq(as.Date("2000-01-01"), length = days, by = "day")
year = year(date)
month = month(date)
x1 = cumsum(rnorm(days, 0.05)) 
x2 = cumsum(rnorm(days, 0.05))
df1 = data.frame(date, year, month, x1, x2)

Ich möchte die x1- und x2-Variablen gleichzeitig aus dem df2-Datenrahmen nach Jahr und Monat zusammenfassen. Mit dem folgenden Code wird die Variable x1 zusammengefasst. Ist es jedoch auch möglich, die Variable x2 gleichzeitig zu aggregieren?

### aggregate variables by year month
df2=aggregate(x1 ~ year+month, data=df1, sum, na.rm=TRUE)
head(df2)

Anregungen wären sehr dankbar.

124
MikeTP

Woher kommt diese year()-Funktion?

Sie können für diese Aufgabe auch das Paket reshape2 verwenden:

require(reshape2)
df_melt <- melt(df1, id = c("date", "year", "month"))
dcast(df_melt, year + month ~ variable, sum)
#  year month         x1           x2
1  2000     1  -80.83405 -224.9540159
2  2000     2 -223.76331 -288.2418017
3  2000     3 -188.83930 -481.5601913
4  2000     4 -197.47797 -473.7137420
5  2000     5 -259.07928 -372.4563522
42
EDi

Ja, in Ihrer formula können Sie cbind die numerischen Variablen zusammenfassen, die aggregiert werden sollen:

aggregate(cbind(x1, x2) ~ year + month, data = df1, sum, na.rm = TRUE)
   year month         x1          x2
1  2000     1   7.862002   -7.469298
2  2001     1 276.758209  474.384252
3  2000     2  13.122369 -128.122613
...
23 2000    12  63.436507  449.794454
24 2001    12 999.472226  922.726589

Siehe ?aggregate, das Argument formula und die Beispiele.

175
Andrie

Verwendung des data.table-Pakets, das schnell ist (nützlich für größere Datensätze)

https://github.com/Rdatatable/data.table/wiki

library(data.table)
df2 <- setDT(df1)[, lapply(.SD, sum), by=.(year, month), .SDcols=c("x1","x2")]
setDF(df2) # convert back to dataframe

Verwenden des plyr-Pakets

require(plyr)
df2 <- ddply(df1, c("year", "month"), function(x) colSums(x[c("x1", "x2")]))

Verwenden von summaryize () aus dem Hmisc-Paket

# need to detach plyr because plyr and Hmisc both have a summarize()
detach(package:plyr)
require(Hmisc)
df2 <- with(df1, summarize( cbind(x1, x2), by=llist(year, month), FUN=colSums))
46
numbercruncher

Mit dem Paket dplyr können Sie die Funktionen summarise_all, summarise_at oder summarise_if verwenden, um mehrere Variablen gleichzeitig zu aggregieren. Für das Beispiel-Dataset können Sie dies wie folgt tun:

library(dplyr)
# summarising all non-grouping variables
df2 <- df1 %>% group_by(year, month) %>% summarise_all(sum)

# summarising a specific set of non-grouping variables
df2 <- df1 %>% group_by(year, month) %>% summarise_at(vars(x1, x2), sum)
df2 <- df1 %>% group_by(year, month) %>% summarise_at(vars(-date), sum)

# summarising a specific set of non-grouping variables based on condition (class)
df2 <- df1 %>% group_by(year, month) %>% summarise_if(is.numeric, sum)

Das Ergebnis der letzten beiden Optionen:

    year month        x1         x2
   <dbl> <dbl>     <dbl>      <dbl>
1   2000     1 -73.58134  -92.78595
2   2000     2 -57.81334 -152.36983
3   2000     3 122.68758  153.55243
4   2000     4 450.24980  285.56374
5   2000     5 678.37867  384.42888
6   2000     6 792.68696  530.28694
7   2000     7 908.58795  452.31222
8   2000     8 710.69928  719.35225
9   2000     9 725.06079  914.93687
10  2000    10 770.60304  863.39337
# ... with 14 more rows

Hinweis: summarise_each ist zugunsten von summarise_all, summarise_at und summarise_if veraltet.


Wie in mein Kommentar oben erwähnt, können Sie auch die recast-Funktion aus dem reshape2- Paket verwenden:

library(reshape2)
recast(df1, year + month ~ variable, sum, id.var = c("date", "year", "month"))

was Ihnen das gleiche Ergebnis geben wird.

41
Jaap

Interessanterweise wird die data.frame-Methode von Base R aggregate hier nicht angezeigt, oben Das Formel-Interface wird verwendet, daher der Vollständigkeit halber:

aggregate(
  x = df1[c("x1", "x2")],
  by = df1[c("year", "month")],
  FUN = sum, na.rm = TRUE
)

Mehr generische Verwendung der data.frame-Methode von aggregate:

Da bieten wir eine

  • data.frame als x und 
  • a list (data.frame ist auch eine list) als by, dies ist sehr nützlich, wenn wir es dynamisch verwenden müssen, z. Die Verwendung anderer Spalten zum Aggregieren und zum Aggregieren ist sehr einfach
  • auch mit maßgeschneiderten Aggregationsfunktionen 

Zum Beispiel so:

colsToAggregate <- c("x1")
aggregateBy <- c("year", "month")
dummyaggfun <- function(v, na.rm = TRUE) {
  c(sum = sum(v, na.rm = na.rm), mean = mean(v, na.rm = na.rm))
}

aggregate(df1[colsToAggregate], by = df1[aggregateBy], FUN = dummyaggfun)
2
Jozef

Spät zur Party, aber vor kurzem einen anderen Weg gefunden, um die zusammenfassenden Statistiken zu erhalten.

library(psych) describe(data)

Wird ausgegeben: Mittelwert, Minimum, Maximum, Standardabweichung, n, Standardfehler, Kurtosis, Schiefe, Median und Bereich für jede Variable. 

0
britt