我已将一堆我的列从因子转换为数字,但代码非常繁琐。我不得不单独转换每一列,最终花费的时间比它应该多。这是我使用的代码(只是一个简短的示例 - 我实际上有更多列):
city1[,CityNames]<-as.numeric(levels(city1[,CityNames]))[city1[,CityNames]]
我几乎是肯定的,而不是完成所有这些,我可以完成:
Error in as.numeric(levels(city1[, CityNames]))[city1[, CityNames]] :
invalid subscript type 'list'
其中CityNames只是我要转换的数据的所有列。但是这不起作用,因为我得到:
{{1}}
谁能说出我做错了什么?或者除了我漫长而恼人的第一种方法之外,还有其他方法可以做到这一点吗?
答案 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()
将这些字符串解释为数字等价物。它可能明显更快,因为它不必对每个值的水平向量进行任何查找。