Summe aus Gruppierung in einer neuen Spalte

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Florianho
Beiträge: 4
Registriert: So Aug 02, 2020 8:04 am

Summe aus Gruppierung in einer neuen Spalte

Beitrag 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
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Summe aus Gruppierung in einer neuen Spalte

Beitrag 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)]
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Summe aus Gruppierung in einer neuen Spalte

Beitrag 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)
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Summe aus Gruppierung in einer neuen Spalte

Beitrag 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?
bigben
Beiträge: 2778
Registriert: Mi Okt 12, 2016 9:09 am

Re: Summe aus Gruppierung in einer neuen Spalte

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Summe aus Gruppierung in einer neuen Spalte

Beitrag 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.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
bigben
Beiträge: 2778
Registriert: Mi Okt 12, 2016 9:09 am

Re: Summe aus Gruppierung in einer neuen Spalte

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Florianho
Beiträge: 4
Registriert: So Aug 02, 2020 8:04 am

Re: Summe aus Gruppierung in einer neuen Spalte

Beitrag 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-)
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Summe aus Gruppierung in einer neuen Spalte

Beitrag 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 !
Werekorden
Beiträge: 83
Registriert: So Feb 04, 2018 7:52 pm

Re: Summe aus Gruppierung in einer neuen Spalte

Beitrag 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
Antworten