Seite 1 von 1

Spalten teilen des gesamten dataframes

Verfasst: Sa Okt 07, 2017 8:53 am
von christin_56
Guten Morgen!

Das ist ein AUsschnitt meines dataframes. Ich würde gerne jede Spalte in zwei Spalten teilen, also die Spaltenanzahl verdoppeln, jeder Buchstabe soll dann in einer Spalte stehen.

Versucht habe ich noch

Code: Alles auswählen

data_split<-for(i in 1:ncol(data))
{ strsplit(as.character(data[i,2], split="", TRUE))
}
Da kommt aber "data_split" als dataframe mit 0 Reihen und 0 Spalten raus, funktioniert also auch nicht...

Hat jemand eine gute Idee? Vielleicht funktioniert es mit der apply()-Funktion?

Ich würde mich über Tipps freuen :)

Re: Spalten teilen des gesamten dataframes

Verfasst: Sa Okt 07, 2017 11:01 am
von jogo
Hallo Christin,

ich würde das so machen:

Code: Alles auswählen

set.seed(42)
x <- c("AA", "AB", "BB")
dat<- data.frame(V1=sample(x, 6, repl=TRUE), V2=sample(x, 6, repl=TRUE), 
                 V3=sample(x, 6, repl=TRUE), V4=sample(x, 6, repl=TRUE))
dat
matrix(sapply(dat, function(x) c(substr(x,1,1), substr(x,2,2))), nrow=nrow(dat))
Natürlich hättest Du auch apply(dat, 2, ...) anwenden können, aber (siehe Hilfetext von apply()) dann wird der Dataframe dat zuerst (intern) in eine Matrix umgewandelt.
Die Funktion sapply() arbeitet auf einer Liste. Ein Dataframe ist eine spezielle Liste, weshalb keine Umwandlung in eine Matrix erfolgen muss.

Gruß, Jörg

Re: Spalten teilen des gesamten dataframes

Verfasst: Sa Okt 07, 2017 9:15 pm
von EDi
Ich hätte es so gemacht:

Code: Alles auswählen

as.data.frame(lapply(dat, function(y) unlist(strsplit(as.character(y), split = ""))))

library(microbenchmark)
microbenchmark(matrix(sapply(dat, function(x) c(substr(x,1,1), substr(x,2,2))), nrow=nrow(dat)),
               as.data.frame(lapply(dat, function(y) unlist(strsplit(as.character(y), split = "")))))

Ist aber langsamer als jörgs Lösung :(

Re: Spalten teilen des gesamten dataframes

Verfasst: Di Okt 10, 2017 9:32 am
von christin_56
Vielen Dank für Eure Hilfe! :)