Seite 1 von 3

Summe aus Gruppierung in einer neuen Spalte

Verfasst: So Aug 02, 2020 8:27 am
von Florianho
Hallo Zusammen,

ich hätte da mal ein Problem. :?:

Wie kann ich den eine Summenspalte hinzufügen, welche zugleich auf eine Gruppierung zurückgreift?
Anbei ein Musterbeispiel. Es gibt noch weitere Spalten wie Monat aber diese sind für dieses Beispiel und das Ergebnis egal.

Farbe <- c("grün", "gelb", "grün","blau", "gelb", "grün")
Regio <- c("Nord", "Süd", "Nord", "Nord", "Süd", "West")
Monat <- c(1,3,5,6,4)
Produktion <- c(10,15,20,5,30)
beispiel <- cbind(Farbe, Regio, Monat, Produktion)
beispiel <- as.data.table(beispiel)
beispiel

#erwartetes Ergebnis grün/Nord 30, gelb/süd 45, blau/Nord 5, grün/West 10

Ziel ist es den Wert zu bekommen in Kombination Farbe/Regio um dann zu wissen je Position/Zeile den Anteil an Gesamt zu kennen (erwartetes Ergebnis Zeile 1: grün/Nord//Monat1/10/30) um im nächsten Step eine anteilige Kostenzuordnung (indir. Kosten) vorzunehmen.

Vielen Dank vorab für Euere Ideen

VG Florian

PS: Den Umweg über eine Duplizierung des df und dann Gruppierung + join zum wieder einfügen kenne ich. Hoffe nur das es etwas simpler/schneller auch geht, da ich einiges mit Kostenverteilung aktuell umsetzen darf :D

Re: Summe aus Gruppierung in einer neuen Spalte

Verfasst: So Aug 02, 2020 2:27 pm
von Athomas
Ziel ist es den Wert zu bekommen in Kombination Farbe/Regio um dann zu wissen je Position/Zeile den Anteil an Gesamt zu kennen
Sollte ich Dich richtig verstanden habe, möchte ich Dich um etwas mehr Sorgfalt bei der Formulierung Deiner Fragen bitten!

Code: Alles auswählen

library(data.table)                                                 # sollte man schon erwähnen!

Beispiel <- data.table(Farbe      = c("grün", "gelb", "grün","blau", "gelb", "grün"),
                       Regio      = c("Nord", "Süd", "Nord", "Nord", "Süd", "West"), 
                       Monat      = c(1,3,5,6,4, 17),               # Phantasiewerte ergänzt, damit die Anzahl stimmt!
                       Produktion = c(10,15,20,5,30, 3426542))

Beispiel[  , Summe_Produktion_pro_Farbe_und_Regio:=sum(Produktion), by=.(Farbe, Regio)]

Re: Summe aus Gruppierung in einer neuen Spalte

Verfasst: Di Aug 04, 2020 11:06 pm
von EDi
Dein Beispiel hat einen Fehler (bzw verlässt sich auf Nebeneffekte).

Ich würde das so machen:

Code: Alles auswählen

Farbe <- c("grün", "gelb", "grün","blau", "gelb", "grün")
Regio <- c("Nord", "Süd", "Nord", "Nord", "Süd", "West")
Monat <- c(1,3,5,6,4, 1)
Produktion <- c(10,15,20,5,30, 10)
beispiel <- data.frame(Farbe, Regio, Monat, Produktion)
beispiel

library(dplyr)
beispiel %>%
  group_by(Farbe, Regio) %>%
  summarise(sum = sum(Produktion)) %>%
  right_join(beispiel, by = c("Farbe", "Regio")) %>%
  mutate(prop = Produktion / sum * 100)

Re: Summe aus Gruppierung in einer neuen Spalte

Verfasst: Mi Aug 05, 2020 9:14 am
von Athomas
EDi hat geschrieben: Di Aug 04, 2020 11:06 pm Dein Beispiel hat einen Fehler (bzw verlässt sich auf Nebeneffekte).
Aha! Möchtest Du das noch begründen?

Re: Summe aus Gruppierung in einer neuen Spalte

Verfasst: Mi Aug 05, 2020 9:42 am
von bigben
Wenn beides gleich gut funktioniert, gefällt mir Athomas' Lösung besser: Florian hat die Benutzung von data.table vorgegeben und da finde ich es unnötig, zusätzlich auch noch dplyr aufzurufen. Es sei denn, dplyr ist "sowieso immer" aktiviert.

Nur der Vollständigkeit halber erwähnt sei die puristische Variante ohne packages:

Code: Alles auswählen

Beispiel <- data.frame(Farbe      = c("grün", "gelb", "grün","blau", "gelb", "grün"),
                       Regio      = c("Nord", "Süd", "Nord", "Nord", "Süd", "West"), 
                       Monat      = c(1,3,5,6,4, 17),               # Phantasiewerte ergänzt, damit die Anzahl stimmt!
                       Produktion = c(10,15,20,5,30, 3426542))

Beispiel$GesamtFarbRegio <- ave(Beispiel$Produktion, Beispiel$Farbe, Beispiel$Regio, FUN = sum)

Beispiel$Anteil <- Beispiel$Produktion / Beispiel$GesamtFarbRegio
JMTC,
Bernhard

Re: Summe aus Gruppierung in einer neuen Spalte

Verfasst: Mi Aug 05, 2020 2:04 pm
von EDi
Athomas hat geschrieben: Mi Aug 05, 2020 9:14 am
EDi hat geschrieben: Di Aug 04, 2020 11:06 pm Dein Beispiel hat einen Fehler (bzw verlässt sich auf Nebeneffekte).
Aha! Möchtest Du das noch begründen?
Die Vektoren Farbe und Monat haben eine unterschiedliche Länge, was dazu führt dass der kürzere recycliert wird. Diese recyclieren ist für mich der Nebeneffekt.

Re: Summe aus Gruppierung in einer neuen Spalte

Verfasst: Mi Aug 05, 2020 2:15 pm
von bigben
@EDi Das verstehe ich nicht. Sowohl Du als auch Athomas, ihr habt beide einen Wert bei Monat ergänzt, um Monat auf die Länge 6 zu bringen und die Warnmeldung vom originalen cbind zu vermeiden. Damit haben Farbe und Monat bei beiden Implementierungen die Länge 6. Was übersehe ich?
Mit einem Kommentar, der sagt "Phantasiewerte ergänzt" ist doch hinreichend darauf hingewiesen, wie man mit dem fragwürdigen Beispielcode umgegangen ist.

LG,
Bernhard

Re: Summe aus Gruppierung in einer neuen Spalte

Verfasst: Fr Aug 07, 2020 1:55 pm
von Florianho
Vielen Dank, hat sehr geholfen. @athomas

Werde beim nächsten Mal etwas genauer schreiben :D Als Neuling im Programmieren und speziell R sei mir dies bitte verziehen 8-)

Re: Summe aus Gruppierung in einer neuen Spalte

Verfasst: Fr Aug 07, 2020 2:19 pm
von Athomas
Florianho hat geschrieben: Fr Aug 07, 2020 1:55 pm Werde beim nächsten Mal etwas genauer schreiben :D Als Neuling im Programmieren und speziell R sei mir dies bitte verziehen 8-)
Alles easy - schön am Ball bleiben :D !

Re: Summe aus Gruppierung in einer neuen Spalte

Verfasst: Mo Aug 10, 2020 12:54 pm
von Werekorden
Hallo,


ich packe meine Frage mal hier mit hin da ich, naja eine ähnliche Frage habe.

Ich möchte eigentlich eine Tabelle erstellen bei der in einer neue Spalte der Mittelwert für die einzelnen Messwerte y bei gleicher Konzentration x erstellt werden. Jetzt braucht man aber z.B. bei der ersten Konzentration 100 den MW nicht in jeder Zeile sondern nur in der dritten Zeile usw. Ist das mit dplyr oder standard R möglich. Ich finde keinen Weg.

Mutate ist ja eigentlich die Funktion um neue Variablen wie den MIttelwert hinzuzufügen.

Code: Alles auswählen

x <- c(100, 100, 100, 200, 200, 500, 500, 1000, 1000)
y <- c(25.5, 24.9, 25.3, 27.9, 27.0, 29.5, 29.7, 30.4, 31.1)

data <- data.frame(x, y)

library(dplyr)
dataMW <- data %>%
  group_by(x) %>%
  summarise(count = n(),
            mw = mean(y, na.rm = TRUE))
)
dataMW
Der Code gibt jetzt erst einmal den Mittelwert der einzlenen Konzentrationen und jetzt gehts irgendwie weiter :?

Danke euch mal wieder für die Hilfe ;)

VG
Andreas