2013-10-02 74 views
5

我有一列数据框,需要转换为数字类型。我已经写了下面的代码来试图做到这一点,但它是说替换有0行。将列转换为数字类型

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

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

任何帮助,将不胜感激。

+0

这是不工作的原因是你在告诉R键查找一个''i'的regmodel'内的对象。在循环内部,'i'是列本身,而不是列的名称。 –

+0

而在R地狱不要忘了8.2.1: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'的类现在是'matrix'。 '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)) 

此柱去列和每转换成数字。然后相应地改变你的行名和列名。