列不从因子转换为数字的可能原因

时间:2014-03-24 00:21:35

标签: r class dataframe

我在这些帖子上查找了答案,但没有一个在我的案例中工作:

R change all columns of type factor to numeric

http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-do-I-convert-factors-to-numeric_003f

How to convert a data frame column to numeric type?

我正在使用我导入的数据框(8600 x 168):

originaldf2<-read.csv("Occupanyrate_Train")。除前三列外,所有列均为数值。导入后,许多列都是类factor。我需要在数字类中使用3到168之间的所有列进行分析。这些列中有许多空值和“ - ”,我通过这样做转换为NA:

originaldf2[originaldf2=="-"]=NA originaldf2[originaldf2==""]=NA。这些列只包含十进制数,整数和NA。我尝试使用以下命令将所有变量转换为数字类:

originaldf2<-as.numeric(as.character(originaldf2[ , 4:168]))我收到错误:Warning message: NAs introduced by coercion我的数据框本身变得很奇怪:

str(originaldf2) num [1:165] NA NA NA NA NA NA NA NA NA NA ...

我也尝试过:as.numeric(levels(originaldf2))[as.integer(originaldf2)]

尝试强制整个数据帧,但我收到错误Error: (list) object cannot be coerced to type 'integer'

然后我注意到有未使用的级别可能是原因,所以我删除了未使用的级别:originaldf2<-str(drop.levels(originaldf2))并试图再次强制但仍然没有发生!这是df(10 x 12)的一个子集:

Property_ID Month Zipcode Occupancy_Rate.Response.Variable. VAR_1 VAR_2 VAR_3 1 A3FF8CD6 13-Jan 30064 0.93 468 10 0.7142857 2 A3FF8CD6 13-Feb 30064 0.93 468 10 0.7142857 3 A3FF8CD6 13-Mar 30064 0.94 468 10 0.7142857 4 A3FF8CD6 13-Apr 30064 0.96 468 10 0.7142857 5 A3FF8CD6 13-May 30064 0.953 468 10 0.7142857 6 A3FF8CD6 13-Jun 30064 0.93 468 10 0.7142857 7 A3FF8CD6 13-Jul 30064 0.925 468 10 0.7142857 8 A3FF8CD6 13-Aug 30064 0.925 468 10 0.7142857 9 A3FF8CD6 13-Sep 30064 0.95 468 10 0.7142857 10 A3FF8CD6 13-Oct 30064 0.945 468 10 0.7142857 11 A3FF8CD6 13-Nov 30064 0.9 NA <NA> NA 12 A3FF8CD6 13-Dec 30064 0.945 NA <NA> NA VAR_4 VAR_5 VAR_6 1 0.5714286 0.8 0.75 2 0.5714286 0.8 0.75 3 0.5714286 0.8 0.75 4 0.5714286 0.8 0.75 5 0.5714286 0.8 0.75 6 0.5714286 0.8 0.75 7 0.5714286 0.8 0.75 8 0.5714286 0.8 0.75 9 0.5714286 0.8 0.75 10 0.5714286 0.8 0.75 11 NA NA NA 12 NA NA NA

3 个答案:

答案 0 :(得分:4)

使用stringsAsFactors的建议只会让你到目前为止。看起来您可能也想使用colClasses。它会将所需的列强制转换为数字并创建适当的NA。

originaldf <- read.csv( file_name, 
                        colClasses=c(rep( "character",3), rep("numeric", 6) ) )

这也使大型数据帧的输入更快(更多,更快),因为用于猜测类的逻辑被绕过了。

答案 1 :(得分:1)

在阅读时使用na.strings参数将-转换为NA

x <- read.csv(na.strings=c('-'),
text="a,b,c
0,,
-,1,2")

 x
   a  b  c
1  0 NA NA
2 NA  1  2

空值在数字列中自动转换为NA-值强制将列解释为factor

答案 2 :(得分:0)

绝对在stringsAsFactors = FALSE语句中使用read.csv。它会工作。