2013-10-02 3 views
5

У меня есть dataframe с кучей столбцов, которые мне нужно преобразовать в числовой тип. Я написал следующий код, чтобы попытаться сделать это, однако он говорит, что замена имеет 0 строк.Пакетное преобразование столбцов в числовой тип

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

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

Любая помощь будет принята с благодарностью.

+0

Причина, по которой это не работает, заключается в том, что вы указываете R на поиск объекта с именем 'i' внутри' regmodel'. Внутри вашего цикла 'i' - это сам столбец, а не имя столбца в любом случае. –

+0

И не забывайте, что 8.2.1 в R Inferno: www.burns-stat.com/pages/Tutor/R_inferno.pdf – Henrik

+1

См. Также http://stackoverflow.com/a/12727871/636656 –

ответ

21

Вы можете использовать sapply для этого:

dat <- sapply(dat, as.numeric) 

Если не каждый столбец нуждается в преобразовании:

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

Может быть полезно что класс 'dat' теперь является' матрицей'. 'dat <- as.data.frame (sapply (dat, as.numeric)' позволяет упростить замену. –

3

Как SenorO отметил, причина исходный код не работает, что $i не будет оцените i, чтобы узнать его текущее значение. Вы должны вместо этого получить доступ и назначить к колонке, используя двойные скобки, которые работают, когда i это имя или номер индекса:

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

следующий подход Ари, вы можете избавиться от петли:

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

Вы также можете сделать это с вашим диапазоном 7: 262 вместо «instanceconvert», так как вы можете получить доступ/назначить имя или номер столбца.

0

Быстро грязный способ сделать это, особенно если у вас есть переменные во всем, что нужно преобразовать, что означало бы, что много кода конвертации - это записать файл и снова прочитать его, используя что-то вроде write.csv /read.csv

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

Просто передайте столбцы, которые вы хотите как кадр d данных в следующее:

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

Это идет столбец за столбцом и преобразует каждый в числовой. Затем просто измените имена строк и имена столбцов соответственно.

Смежные вопросы