2013-10-02 9 views
5

Mam ramkę danych z grupą kolumn, które muszę przekonwertować na typ liczbowy. Napisałem poniższy kod, aby spróbować to zrobić, ale mówi się, że zamiennik ma 0 wierszy.Konwertuj wsadowo kolumny na typ numeryczny

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

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

Każda pomoc zostanie doceniona.

+0

Powodem tego nie działa jest to, że mówisz R, aby szukał obiektu o nazwie 'i' wewnątrz' regmodel'. Wewnątrz pętli "i" jest samą kolumną, a nie nazwą kolumny. –

+0

I nie zapomnij 8.2.1 w R Inferno: www.burns-stat.com/pages/Tutor/R_inferno.pdf – Henrik

+1

Zobacz także http://stackoverflow.com/a/12727871/636656 –

Odpowiedz

21

Można użyć sapply na to:

dat <- sapply(dat, as.numeric) 

Jeśli nie każda kolumna potrzebuje konwersji:

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

Może być przydatne zauważyć, że klasa 'dat' jest teraz' macierzą'. 'dat <- as.data.frame (sapply (dat, as.numeric)' pozwala na łatwiejszą wymianę. –

3

Jak SenorO wskazał, powodem oryginalny kod nie działa jest to, że $i nie będzie oceń i, aby dowiedzieć się, jaka jest obecna wartość. Należy zamiast dostępu i przypisać do kolumny za pomocą podwójne wsporniki, które pracują kiedy i to nazwa lub indeks numer:

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

następujące podejście Ariego, można pozbyć się pętli:

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

Możesz to również zrobić z zasięgiem 7: 262, zamiast "instanceconvert", ponieważ możesz uzyskać dostęp/przypisać według nazwy lub numeru kolumny.

0

Szybki, brudny sposób na zrobienie tego, zwłaszcza jeśli masz zmienne, które wymagają konwersji, co oznaczałoby, że dużo kodu konwersji jest zapisanie pliku i ponowne wczytanie go za pomocą czegoś takiego jak write.csv /read.csv

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

Wystarczy przejść kolumny, które mają jako ramki danych d się, co następuje:

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

To idzie kolumna po kolumnie i konwertuje każdy w numerycznej. Następnie zmień odpowiednio nazwy wierszy i nazwy kolumn.

Powiązane problemy