split() vertikal auf data.frames anwenden?

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
Curnen
Beiträge: 27
Registriert: Fr Nov 18, 2016 3:45 pm

split() vertikal auf data.frames anwenden?

Beitrag von Curnen »

Hallo Leute,

Ich verwende regelmäßig die Funktion split(), um einen data.frame zeilenweise in eine Liste zu packen um z.B. mittels lapply Plots mit Teildaten zu erstellen:

Code: Alles auswählen

data("iris")
iris_list_hsplit <- split(iris,iris[,"Species"])
Bei meinem jetztigen Problem würde ich allerdings gerne Gruppen von Spalten auf eine Liste aufteilen - also quasi das hier "elegant" tun - ohne die Gruppen manuell zu definieren:

Code: Alles auswählen

data("iris")
iris_list_vsplit <- list("Sepal"= iris[,grepl("Sepal",colnames(iris))],
                         "Petal"= iris[,grepl("Petal",colnames(iris))])
Gibt es dafür auch eine praktische Funktion? Ein einfaches t(iris) vor split macht leider daraus eine Matrix...

Viele Grüße und Danke
Matthias
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: split() vertikal auf data.frames anwenden?

Beitrag von jogo »

Hallo Matthias,

vielleicht gefällt Dir ja dies:

Code: Alles auswählen

data("iris")
Cols <- lapply(c("Sepal", "Petal"), FUN=grep, x=colnames(iris), value=TRUE)
iris_list_vsplit <- lapply(Cols, FUN=subset, x=iris, subset=TRUE)
Gruß, Jörg
p.s.:
Eigentlich wollte ich eine Lösung in der Form:
lapply(Cols, FUN='[', x=iris, ...) ## bzw.
lapply(Cols, FUN='[.data.frame', x=iris, ...)
leider habe ich das nicht hinbekommen.
Curnen
Beiträge: 27
Registriert: Fr Nov 18, 2016 3:45 pm

Re: split() vertikal auf data.frames anwenden?

Beitrag von Curnen »

Hallo jogo,

Vielen Dank, das ist für meine Bedürfnisse perfekt - ich wollte nur umgehen, die Gruppen und ihre Anzahl manuell in den Code schreiben zu müssen, mit deiner Lösung kann ich sie der Funktion jetzt als Variablen übergeben.

Das P.S. wäre nur Spielerei - ich hab eben kurz was auf Basis von mapply() probiert, aber es auch nicht hinbekommen.

VG
Matthias
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: split() vertikal auf data.frames anwenden?

Beitrag von jogo »

Hallo Matthias,

subset() ist ein ziemliches Geschoss. Hier eine Variante:

Code: Alles auswählen

data("iris")
L <- list(1:2, 3:4)
lapply(L, function(l) head(iris)[l])
Gruß, Jörg
Antworten