2013-10-02 8 views
5

Ich habe einen Datenrahmen mit einer Reihe von Spalten, die ich in den numerischen Typ konvertieren muss. Ich habe den folgenden Code geschrieben, um dies zu tun, aber es heißt, der Ersatz hat 0 Zeilen.Batch konvertieren Spalten in numerischen Typ

instanceconvert <- colnames(regmodel[7:262]) 

for (i in instanceconvert) 
{ 
    regmodel$i <- as.numeric(regmodel$i) 
} 

Jede Hilfe wäre willkommen.

+0

Der Grund, warum dies nicht funktioniert, ist, dass Sie R anweisen, nach einem Objekt mit dem Namen 'i' in' regmodel' zu suchen. Innerhalb Ihrer Schleife ist "i" die Spalte selbst, nicht der Name der Spalte. –

+0

Und nicht zu vergessen 8.2.1 in der R Inferno: www.burns-stat.com/pages/Tutor/R_inferno.pdf – Henrik

+1

Siehe auch http://StackOverflow.com/a/12727871/636656 –

Antwort

21

Sie können diese sapply für verwenden:

dat <- sapply(dat, as.numeric) 

Wenn nicht jede Spalte Umwandlung benötigt:

library(taRifx) 
dat <- japply(dat, which(sapply(dat, class)=="character"), as.numeric) 
+1

Es kann nützlich sein zu beachten, dass die Klasse von "dat" jetzt "matrix" ist. 'dat <- as.data.frame (sapply (dat, as.numeric)' ermöglicht einen einfacheren Austausch. –

3

Wie Senoro darauf hingewiesen, ist der Grund Ihrer ursprünglichen Code nicht funktioniert, ist, dass $i wird nicht werte i aus, um den aktuellen Wert herauszufinden. Sie sollten zugreifen und weisen stattdessen doppelte eckige Klammern auf die Spalte, die Arbeit, wenn i ein Name oder Index-Nummer lautet:

regmodel[,instanceconvert] <- 
    lapply(regmodel[,instanceconvert,drop=FALSE],as.numeric) 

:

for (i in instanceconvert) 
{ 
    regmodel[[i]] <- as.numeric(regmodel[[i]]) 
} 

Nach Ari Ansatz können Sie von der Schleife loswerden Sie können dies auch mit Ihrem Bereich 7: 262 anstelle von "instanceconvert" tun, da Sie auf den Namen oder die Spaltennummer zugreifen/zuweisen können.

0

Ein schneller ein schmutziger Weg, um es zu tun, vor allem, wenn Sie Variablen haben, die konvertieren müssen, was bedeutet, dass eine Menge Konversionscode ist, die Datei zu schreiben und wieder einlesen mit etwas wie write.csv /read.csv

write.csv(regmodel, file="regmodel.csv") 
read.csv(file="regmodel.csv") 
0

passieren Sie die Spalten, die Sie als Datenrahmen wollen d in die folgenden:

data.frame(apply(d, 2, as.numeric)) 

Dies geht Spalte für Spalte und wandelt jedes in eine numerische. Dann ändern Sie einfach Ihre Zeilen- und Spaltennamen entsprechend.

Verwandte Themen