【问题标题】:Possible reasons for column not converting from factor to numeric列未从因子转换为数字的可能原因
【发布时间】:2014-05-01 04:44:21
【问题描述】:

我在这些线程上查找了答案,但在我的情况下都没有:

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=="-"]=NAoriginaldf2[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

【问题讨论】:

  • 使用originaldf2 &lt;- read.csv("Occupanyrate_Train.csv", stringsAsFactors = FALSE)再试一次
  • 我认为 stringAsFactors 不是read.csv 中的论据。 . .我收到错误消息:Error in read.table(file = file, header = header, sep = sep, quote = quote, : unused argument (stringAsFactors = FALSE)
  • stringsAsFactors 不是read.csv 的直接参数,而是read.table 的参数,随后被调用。
  • 我不知道 read.csv 在没有 .csv 扩展名的情况下也能工作
  • 所以我添加了stringsAsFactors 参数并尝试:originaldf&lt;-as.numeric(as.character(originaldf[ ,c(sprintf("VAR_%.i", 1:164))])) 因为我希望从 1 到 164 的所有变量列都更改为数字但它不起作用!同样的错误 - Warning message: NAs introduced by coercion

标签: r class dataframe


【解决方案1】:

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

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

由于绕过了用于猜测类的逻辑,这也使得大型数据帧的输入发生(非常、非常)快。

【讨论】:

    【解决方案2】:

    在阅读时使用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

    【讨论】:

    • 天哪!什么山鼹鼠山的故事。谢谢。出于兴趣,如果我在读取文件时不使用na.strings将“-”更改为NA,而是在导入后将“-”替换为NA,然后删除未使用的级别,有没有办法改变从因子到数值的类?
    • @vagabond 据我所知(如果我错了,我相信有人会纠正我),你必须逐列进行,例如lapply.
    【解决方案3】:

    一定要在read.csv 语句中使用stringsAsFactors = FALSE。它会起作用的。

    【讨论】:

    • 不。它绝对不是这样工作的!使用stringAsFactors=FALSE,我的专栏被解读为class: character,我相信这更接近一步。如果我将其声明为 TRUE,则它们将保留为类因素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2015-06-01
    • 2016-03-11
    • 1970-01-01
    • 2012-03-04
    相关资源
    最近更新 更多