Subset in R

Wie erweitere ich R um eigene Funktionen oder Pakete? Welches Paket ist passend für meine Fragestellung?

Moderatoren: EDi, jogo

kingerde
Beiträge: 9
Registriert: Do Jun 03, 2021 9:34 pm

Subset in R

Beitrag von kingerde »

Hallo zusammen!
Ich bin blutiger R Anfänger und wäre über eure Hilfe sehr dankbar.

Ich habe momentan einen Datensatz mit verschiedenen Unternehmen und einem Zeitraum von 2005-2020. Für meine spätere Analyse muss der komplette Datensatz nach den Unternehmen aufgeteilt werden. Der Datensatz beinhaltet die Codes der Unternehmen und auch die Namen der Unternehmen.

Gibt es hier die Möglichkeit, den "großen" Datensatz direkt in verschiedene Datensätze (mit jeweils nur ein Unternehmen) aufzuteilen?

Der Datensatz sieht bspw. so aus. Ich möchte nun einen Datensatz erstellen, nur nur "Beispiel Unternehmen 1" und logischerweise die Kennzahlen zum Unternehmen.
Code Name Jahr
1 Beispiel Unternehmen 1 2005
1 Beispiel Unternehmen 1 2006
1 Beispiel Unternehmen 1 2007
1 Beispiel Unternehmen 1 2008
1 Beispiel Unternehmen 1 2009
1 Beispiel Unternehmen 1 2010
1 Beispiel Unternehmen 1 2011
2 Beispiel Unternehmen 2 2005
2 Beispiel Unternehmen 2 2006
2 Beispiel Unternehmen 2 2007
2 Beispiel Unternehmen 2 2008
2 Beispiel Unternehmen 2 2009
2 Beispiel Unternehmen 2 2010
2 Beispiel Unternehmen 2 2011

Ich hoffe es war halbwegs verständlich. Danke!
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Subset in R

Beitrag von bigben »

Hallo kingerde,

ich denke es war verständlich, ich denke aber nicht, dass es eine gute Idee ist. Wenn Du uns erzählst, was Du im weiteren Verlauf mit den Daten machen willst, dann können wir wahrscheinlich eine bessere Lösung anbieten.

Aber das hier geht auch:

Code: Alles auswählen

bsp <- data.frame(name = rep(c("ADAC", "Allianz", "BASF"), each = 5),
                  jahr = rep(2015:2019), 
                  wert = round(runif(15, 0, 1000),2))
print(bsp)  # so sehen meine Beispieldaten aus

lapply(unique(bsp$name), \(n) subset(bsp, name == n))
Die ersten vier Zeilen sind nur zum Erstellen und Darstellen eines Datenbeispiels. Die letzte Zeile zerteilt den Dataframe in Stücke mit lauter gleichen Firmennamen und Du bekommst dann eine Liste dieser Dataframes zurück:

Code: Alles auswählen

liste <- lapply(unique(bsp$name), \(n) subset(bsp, name == n))
print(liste[[1]])
print(liste[[2]])
print(liste[[3]])
Das läuft so nur in der neuesten R-Version, dürfte aber die gestellte Frage beantworten. Wie gesagt, es hilft wahrscheinlich, wenn Du uns das große Bild beschreibst. Siehe auch: https://de.wikipedia.org/wiki/XY-Problem

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Subset in R

Beitrag von jogo »

Hallo kingerde,

willkommen im Forum!
Eigentlich möchtest Du das doch bestimmt für jedes Unternehmen machen, richtig?
Also (ich nehme mal die Beispieldaten von Bernhard, danke):

Code: Alles auswählen

bsp <- data.frame(name = rep(c("ADAC", "Allianz", "BASF"), each = 5),
                  jahr = rep(2015:2019), 
                  wert = round(runif(15, 0, 1000),2))
L <- split(bsp, bsp$name)
 
myfun <- function(einUnternehmen) {
   ## mach irgendwas mit einUnternehmen$jahr und einUnternehmen$wert ...
   return(...)
}
 
lapply(L, FUN=myfun)  ### oder auch sapply(...)
kingerde
Beiträge: 9
Registriert: Do Jun 03, 2021 9:34 pm

Re: Subset in R

Beitrag von kingerde »

bigben hat geschrieben: Do Jun 03, 2021 10:34 pm Hallo kingerde,

ich denke es war verständlich, ich denke aber nicht, dass es eine gute Idee ist. Wenn Du uns erzählst, was Du im weiteren Verlauf mit den Daten machen willst, dann können wir wahrscheinlich eine bessere Lösung anbieten.

Aber das hier geht auch:

Code: Alles auswählen

bsp <- data.frame(name = rep(c("ADAC", "Allianz", "BASF"), each = 5),
                  jahr = rep(2015:2019), 
                  wert = round(runif(15, 0, 1000),2))
print(bsp)  # so sehen meine Beispieldaten aus

lapply(unique(bsp$name), \(n) subset(bsp, name == n))
Die ersten vier Zeilen sind nur zum Erstellen und Darstellen eines Datenbeispiels. Die letzte Zeile zerteilt den Dataframe in Stücke mit lauter gleichen Firmennamen und Du bekommst dann eine Liste dieser Dataframes zurück:

Code: Alles auswählen

liste <- lapply(unique(bsp$name), \(n) subset(bsp, name == n))
print(liste[[1]])
print(liste[[2]])
print(liste[[3]])
Das läuft so nur in der neuesten R-Version, dürfte aber die gestellte Frage beantworten. Wie gesagt, es hilft wahrscheinlich, wenn Du uns das große Bild beschreibst. Siehe auch: https://de.wikipedia.org/wiki/XY-Problem

LG,
Bernhard

Danke für die schnelle Hilfe. Ich werde später mal dran arbeiten.

Ich schreibe eine Abschlussarbeit in der Uni. Meine empirische Untersuchung basiert auf zwei Modelle. Die Modelle basieren auf eine Zeitreihen Regressionsanalyse.

In der ersten Untersuchung führe ich eine ganz normale Regression durch.
In der zweiten Untersuchung eine Trend Regression, wobei ich die Residuen der Regression für eine spätere Regression benötige.

So wie ich es in den Studien verstanden habe, wurde in den Modellen die Regression auch für jedes Unternehmen die Regression durchgeführt - daher müsste ich meinen Datensatz in Unternehmen aufteilen.

Mit einer Paneldatenregression würde ich in der zweiten Untersuchung wahrscheinlich nicht weit kommen, aber da kenne ich mich Stand jetzt nicht gut genug mit R aus.
kingerde
Beiträge: 9
Registriert: Do Jun 03, 2021 9:34 pm

Re: Subset in R

Beitrag von kingerde »

jogo hat geschrieben: Fr Jun 04, 2021 9:05 am Hallo kingerde,

willkommen im Forum!
Eigentlich möchtest Du das doch bestimmt für jedes Unternehmen machen, richtig?
Also (ich nehme mal die Beispieldaten von Bernhard, danke):

Code: Alles auswählen

bsp <- data.frame(name = rep(c("ADAC", "Allianz", "BASF"), each = 5),
                  jahr = rep(2015:2019), 
                  wert = round(runif(15, 0, 1000),2))
L <- split(bsp, bsp$name)
 
myfun <- function(einUnternehmen) {
   ## mach irgendwas mit einUnternehmen$jahr und einUnternehmen$wert ...
   return(...)
}
 
lapply(L, FUN=myfun)  ### oder auch sapply(...)
Genau, ich möchte das für jedes Unternehmen machen. Auch danke dir für die Antwort. Das wird mir bestimmt schon deutlich helfen.
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Subset in R

Beitrag von bigben »

Hallo kingerde,

Jörgs split() ist nochmal eleganter als meine selbstgeschriebene Lösung.
So wie ich es in den Studien verstanden habe, wurde in den Modellen die Regression auch für jedes Unternehmen die Regression durchgeführt - daher müsste ich meinen Datensatz in Unternehmen aufteilen.
Genau diese Annahme ist nicht unbedingt der beste Weg in R. Nehmen wir nochmal meinen Beispieldatensatz von oben:

Code: Alles auswählen

bsp <- data.frame(name = rep(c("ADAC", "Allianz", "BASF"), each = 5),
                  jahr = rep(2015:2019), 
                  wert = round(runif(15, 0, 1000),2))
print(bsp)  # so sehen meine Beispieldaten aus
Wenn ich jetzt für jede der Firmen eine lineare Regression (Wert in Abhängigkeit der Jahreszahl) durchführen möchte, dann kann ich alle diese Regressionen mit einem Befehl machen, ohne den Datensatz vorher in lauter Teildatensätze aufspalten zu müssen.
Könnte so aussehen:

Code: Alles auswählen

by(bsp, INDICES = bsp$name, function(n) summary(lm(wert ~ jahr, data = n)))
Diese eine Zeile führt in dem Beispiel zu drei linearen Regressionen, für jede Firma eine.

Du kannst das natürlich machen wie Du willst, ich wollte nur erwähnt haben, dass der Gedanke, Du *müsstest* da was aufteilen so nicht stimmt. R versteht auch komplexe Anweisungen wie "mach für jede Firma in diesem Dataframe eine eigene Regression".

Viel Spaß beim R lernen,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
kingerde
Beiträge: 9
Registriert: Do Jun 03, 2021 9:34 pm

Re: Subset in R

Beitrag von kingerde »

bigben hat geschrieben: Fr Jun 04, 2021 2:49 pm Hallo kingerde,

Jörgs split() ist nochmal eleganter als meine selbstgeschriebene Lösung.
So wie ich es in den Studien verstanden habe, wurde in den Modellen die Regression auch für jedes Unternehmen die Regression durchgeführt - daher müsste ich meinen Datensatz in Unternehmen aufteilen.
Genau diese Annahme ist nicht unbedingt der beste Weg in R. Nehmen wir nochmal meinen Beispieldatensatz von oben:

Code: Alles auswählen

bsp <- data.frame(name = rep(c("ADAC", "Allianz", "BASF"), each = 5),
                  jahr = rep(2015:2019), 
                  wert = round(runif(15, 0, 1000),2))
print(bsp)  # so sehen meine Beispieldaten aus
Wenn ich jetzt für jede der Firmen eine lineare Regression (Wert in Abhängigkeit der Jahreszahl) durchführen möchte, dann kann ich alle diese Regressionen mit einem Befehl machen, ohne den Datensatz vorher in lauter Teildatensätze aufspalten zu müssen.
Könnte so aussehen:

Code: Alles auswählen

by(bsp, INDICES = bsp$name, function(n) summary(lm(wert ~ jahr, data = n)))
Diese eine Zeile führt in dem Beispiel zu drei linearen Regressionen, für jede Firma eine.

Du kannst das natürlich machen wie Du willst, ich wollte nur erwähnt haben, dass der Gedanke, Du *müsstest* da was aufteilen so nicht stimmt. R versteht auch komplexe Anweisungen wie "mach für jede Firma in diesem Dataframe eine eigene Regression".

Viel Spaß beim R lernen,
Bernhard
Hallo Bernhard,

das erspart mir sehr viel Arbeit. Ganz großes Danke! :)

Schönes Wochenende :)
kingerde
Beiträge: 9
Registriert: Do Jun 03, 2021 9:34 pm

Re: Subset in R

Beitrag von kingerde »

bigben hat geschrieben: Fr Jun 04, 2021 2:49 pm Hallo kingerde,

Jörgs split() ist nochmal eleganter als meine selbstgeschriebene Lösung.
So wie ich es in den Studien verstanden habe, wurde in den Modellen die Regression auch für jedes Unternehmen die Regression durchgeführt - daher müsste ich meinen Datensatz in Unternehmen aufteilen.
Genau diese Annahme ist nicht unbedingt der beste Weg in R. Nehmen wir nochmal meinen Beispieldatensatz von oben:

Code: Alles auswählen

bsp <- data.frame(name = rep(c("ADAC", "Allianz", "BASF"), each = 5),
                  jahr = rep(2015:2019), 
                  wert = round(runif(15, 0, 1000),2))
print(bsp)  # so sehen meine Beispieldaten aus
Wenn ich jetzt für jede der Firmen eine lineare Regression (Wert in Abhängigkeit der Jahreszahl) durchführen möchte, dann kann ich alle diese Regressionen mit einem Befehl machen, ohne den Datensatz vorher in lauter Teildatensätze aufspalten zu müssen.
Könnte so aussehen:

Code: Alles auswählen

by(bsp, INDICES = bsp$name, function(n) summary(lm(wert ~ jahr, data = n)))
Diese eine Zeile führt in dem Beispiel zu drei linearen Regressionen, für jede Firma eine.

Du kannst das natürlich machen wie Du willst, ich wollte nur erwähnt haben, dass der Gedanke, Du *müsstest* da was aufteilen so nicht stimmt. R versteht auch komplexe Anweisungen wie "mach für jede Firma in diesem Dataframe eine eigene Regression".

Viel Spaß beim R lernen,
Bernhard

Hallo Bernhard,

ich hätte noch eine Frage. Ist es mit der Methode möglich die ermittelten Residuen als neue Spalte im Datensatz hinzuzufügen?

Danke.

LG
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Subset in R

Beitrag von bigben »

doch, doch:

Code: Alles auswählen

bsp <- data.frame(name = rep(c("ADAC", "Allianz", "BASF"), each = 5),
                  jahr = rep(2015:2019), 
                  wert = round(runif(15, 0, 1000),2))

bsp$residuen <- unlist(by(bsp, INDICES = bsp$name, function(n) lm(wert ~ jahr, data = n)$residuals))
print(bsp)
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
h.itup
Beiträge: 11
Registriert: So Jun 06, 2021 5:34 pm

Re: Subset in R

Beitrag von h.itup »

bigben hat geschrieben: Fr Jun 04, 2021 2:49 pm Hallo kingerde,

Jörgs split() ist nochmal eleganter als meine selbstgeschriebene Lösung.
So wie ich es in den Studien verstanden habe, wurde in den Modellen die Regression auch für jedes Unternehmen die Regression durchgeführt - daher müsste ich meinen Datensatz in Unternehmen aufteilen.
Genau diese Annahme ist nicht unbedingt der beste Weg in R. Nehmen wir nochmal meinen Beispieldatensatz von oben:

Code: Alles auswählen

bsp <- data.frame(name = rep(c("ADAC", "Allianz", "BASF"), each = 5),
                  jahr = rep(2015:2019), 
                  wert = round(runif(15, 0, 1000),2))
print(bsp)  # so sehen meine Beispieldaten aus
Wenn ich jetzt für jede der Firmen eine lineare Regression (Wert in Abhängigkeit der Jahreszahl) durchführen möchte, dann kann ich alle diese Regressionen mit einem Befehl machen, ohne den Datensatz vorher in lauter Teildatensätze aufspalten zu müssen.
Könnte so aussehen:

Code: Alles auswählen

by(bsp, INDICES = bsp$name, function(n) summary(lm(wert ~ jahr, data = n)))
Diese eine Zeile führt in dem Beispiel zu drei linearen Regressionen, für jede Firma eine.

Du kannst das natürlich machen wie Du willst, ich wollte nur erwähnt haben, dass der Gedanke, Du *müsstest* da was aufteilen so nicht stimmt. R versteht auch komplexe Anweisungen wie "mach für jede Firma in diesem Dataframe eine eigene Regression".

Viel Spaß beim R lernen,
Bernhard
Moin Bernhard,

ich habe auch mal eine Frage und die passt hier ganz gut rein. Meine Datensatz ist ungefähr ähnlich wie der von KingErde. Ich benutze für meine Regression folgenden Code

Code: Alles auswählen

library(lme4)
library(broom)
library(purrr)
library(gt)

mods  <- lme4::lmList(Reaction ~ Days | Subject, sleepstudy)
Weißt du ob es möglich ist, (mein Datensatz besteht bspw. 9 Jahren pro Gruppe) z.B. alle drei Jahre eine Regression für jede Gruppe (Subject) laufen zu lassen, sodass dann jede Gruppe 3 Regressionen hat? Ist es möglich dazu noch eine Bedingung aufzustellen?
Antworten