转换为数字的有效方法

cod*_*erX 1 r

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

city1$NY <-as.numeric(levels(city1$NY))[city1$NY]   
city1$CHI<-as.numeric(levels(city1$CHI))[city1$CHI] 
city1$LA <-as.numeric(levels(city1$LA))[city1$LA]   
city1$ATL<-as.numeric(levels(city1$ATL))[city1$ATL] 
city1$MIA<-as.numeric(levels(city1$MIA))[city1$MIA]
Run Code Online (Sandbox Code Playgroud)

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

city1[,CityNames]<-as.numeric(levels(city1[,CityNames]))[city1[,CityNames]]
Run Code Online (Sandbox Code Playgroud)

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

Error in as.numeric(levels(city1[, CityNames]))[city1[, CityNames]] : 
  invalid subscript type 'list'
Run Code Online (Sandbox Code Playgroud)

谁能说出我做错了什么?或者除了我漫长而讨厌的第一种方法之外,还有简单的方法来完成这项任务吗?

Fra*_*ank 5

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

city1[,CityNames]<-as.numeric(levels(city1[,CityNames]))[city1[,CityNames]]
Run Code Online (Sandbox Code Playgroud)

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

city1[,CityNames] <- lapply(city1[,CityNames], function(x) as.numeric(levels(x))[x] )
Run Code Online (Sandbox Code Playgroud)

最初的方法不起作用,因为

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