Seite 1 von 1

split() vertikal auf data.frames anwenden?

Verfasst: Do Aug 10, 2017 5:28 pm
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

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

Verfasst: Do Aug 10, 2017 8:04 pm
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.

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

Verfasst: Fr Aug 11, 2017 11:14 am
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

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

Verfasst: Fr Aug 11, 2017 11:49 am
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