Summe aus Gruppierung in einer neuen Spalte
Summe aus Gruppierung in einer neuen Spalte
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
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
Re: Summe aus Gruppierung in einer neuen Spalte
Sollte ich Dich richtig verstanden habe, möchte ich Dich um etwas mehr Sorgfalt bei der Formulierung Deiner Fragen bitten!Ziel ist es den Wert zu bekommen in Kombination Farbe/Regio um dann zu wissen je Position/Zeile den Anteil an Gesamt zu kennen
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
Dein Beispiel hat einen Fehler (bzw verlässt sich auf Nebeneffekte).
Ich würde das so machen:
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
.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Re: Summe aus Gruppierung in einer neuen Spalte
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:
JMTC,
Bernhard
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
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Summe aus Gruppierung in einer neuen Spalte
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
.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Re: Summe aus Gruppierung in einer neuen Spalte
@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
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
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Summe aus Gruppierung in einer neuen Spalte
Vielen Dank, hat sehr geholfen. @athomas
Werde beim nächsten Mal etwas genauer schreiben Als Neuling im Programmieren und speziell R sei mir dies bitte verziehen
Werde beim nächsten Mal etwas genauer schreiben Als Neuling im Programmieren und speziell R sei mir dies bitte verziehen
-
- Beiträge: 83
- Registriert: So Feb 04, 2018 7:52 pm
Re: Summe aus Gruppierung in einer neuen Spalte
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.
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
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
Danke euch mal wieder für die Hilfe
VG
Andreas