转换为数字的有效方法

时间:2015-10-02 20:14:55

标签: r

我已将一堆我的列从因子转换为数字,但代码非常繁琐。我不得不单独转换每一列,最终花费的时间比它应该多。这是我使用的代码(只是一个简短的示例 - 我实际上有更多列):

city1[,CityNames]<-as.numeric(levels(city1[,CityNames]))[city1[,CityNames]]

我几乎是肯定的,而不是完成所有这些,我可以完成:

Error in as.numeric(levels(city1[, CityNames]))[city1[, CityNames]] : 
  invalid subscript type 'list'

其中CityNames只是我要转换的数据的所有列。但是这不起作用,因为我得到:

{{1}}

谁能说出我做错了什么?或者除了我漫长而恼人的第一种方法之外,还有其他方法可以做到这一点吗?

3 个答案:

答案 0 :(得分:5)

  

我几乎是肯定的,而不是做所有这些,我可以做到:

city1[,CityNames]<-as.numeric(levels(city1[,CityNames]))[city1[,CityNames]]

因此,需要进行一些小改动:

city1[,CityNames] <- lapply(city1[,CityNames], function(x) as.numeric(levels(x))[x] )

原始方法不起作用,因为

  • levels是特定于矢量的,因此不清楚myvec = levels(city1[,CityNames])是什么。
  • myvec[ city1[,CityNames] ]会抛出错误,因为city1[,CityNames]是一个data.frame,不能以这种方式用于子集。

答案 1 :(得分:0)

当我想将data.frame中的许多列转换为不同的数据类型时,这通常是我所做的:

convNames <- c("NY", "CHI", "LA", "ATL", "MIA")
for(name in convNames) { city1[, name] <- as.numeric(as.character((city1[, name])) }

这是一个很好的两行,你只需要添加你想要强制转换到convNames向量的列的名称,就可以在下面的强制循环中添加一个新列。

编辑:做一个因素问题,做上面的lapply方法。

答案 2 :(得分:0)

我不确定它是否更快,但可能是因为查找可能会减慢你的速度。试试city1 <- as.numeric(as.character(city1))as.character()转换为级别值,然后as.numeric()将这些字符串解释为数字等价物。它可能明显更快,因为它不必对每个值的水平向量进行任何查找。