Wie kann ich verschiedene Aggregatfunktionen auf verschiedene Spalten in R anwenden?

StackOverflow https://stackoverflow.com//questions/10702708

  •  13-12-2019
  •  | 
  •  

Frage

Wie kann ich verschiedene Aggregatfunktionen auf verschiedene Spalten in R anwenden?Der aggregate() Die Funktion bietet nur ein zu übergebendes Funktionsargument:

V1  V2        V3
1   18.45022  62.24411694
2   90.34637  20.86505214
1   50.77358  27.30074987
2   52.95872  30.26189013
1   61.36935  26.90993530
2   49.31730  70.60387016
1   43.64142  87.64433517
2   36.19730  83.47232907
1   91.51753  0.03056485
... ...       ...

> aggregate(sample,by=sample["V1"],FUN=sum)
  V1 V1       V2       V3
1  1 10 578.5299 489.5307
2  2 20 575.2294 527.2222

Wie kann ich mich bewerben? anders Funktion für jede Spalte, d. h.Aggregat V2 mit dem mean() Funktion und V2 mit dem sum() Funktion, ohne Aufruf aggregate() mehrmals?

War es hilfreich?

Lösung

Für diese Aufgabe werde ich verwenden ddply In plyr

> library(plyr)
> ddply(sample, .(V1), summarize, V2 = sum(V2), V3 = mean(V3))
  V1       V2       V3
1  1 578.5299 48.95307
2  2 575.2294 52.72222

Andere Tipps

...Oder die Funktion data.table im gleichnamigen Paket:

library(data.table)

myDT <- data.table(sample) # As mdsumner suggested, this is not a great name

myDT[, list(sumV2 = sum(V2), meanV3 = mean(V3)), by = V1]

#      V1    sumV2   meanV3
# [1,]  1 578.5299 48.95307
# [2,]  2 575.2294 52.72222

Nennen wir den Datenrahmen x statt sample was bereits vergeben ist.

BEARBEITEN:

Der by Die Funktion bietet eine direktere Route als die Funktion „Teilen/Anwenden/Kombinieren“.

by(x, list(x$V1), f)

:BEARBEITEN

lapply(split(x, x$V1), myfunkyfunctionthatdoesadifferentthingforeachcolumn)

Natürlich ist das keine separate Funktion für jede Spalte, aber man kann beide Aufgaben erledigen.

myfunkyfunctionthatdoesadifferentthingforeachcolumn = function(x) c(sum(x$V2), mean(x$V3))

Es sind bequeme Methoden zum Zusammenstellen des Ergebnisses möglich, beispielsweise diese (aber schauen Sie sich das Plyr-Paket für eine umfassende Lösung an, denken Sie über diese Motivation nach, etwas Besseres zu lernen).

 matrix(unlist(lapply(split(x, x$V1), myfunkyfunctionthatdoesadifferentthingforeachcolumn)), ncol = 2, byrow = TRUE, dimnames = list(unique(x$V1), c("sum", "mean")))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top