Spalten teilen des gesamten dataframes

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

Moderatoren: EDi, jogo

Antworten
christin_56

Spalten teilen des gesamten dataframes

Beitrag 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 :)
Zuletzt geändert von christin_56 am Di Okt 10, 2017 9:31 am, insgesamt 2-mal geändert.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Spalten teilen des gesamten dataframes

Beitrag 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
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Spalten teilen des gesamten dataframes

Beitrag 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 :(
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
Bild.
christin_56

Re: Spalten teilen des gesamten dataframes

Beitrag von christin_56 »

Vielen Dank für Eure Hilfe! :)
Antworten