【问题标题】:read.table reads numbers as factorsread.table 读取数字作为因子
【发布时间】:2014-07-15 11:21:42
【问题描述】:

我有以下示例文件:

"id";"PCA0";"PCA1";"PCA2"
1;6.142741644872954;1.2075898020608253;1.8946959360032403   
2;-0.5329026419681557;-8.586870627925729;4.510113575138726

当我尝试阅读时:

d <- read.table("file.csv", sep=";", header=T)

id 是整数列,PCA0 是数字,所有后续列都是因子

class(d$iid)
[1] "integer"
class(d$PCA0)
[1] "numeric"
class(d$PCA1)
[1] "factor"
class(d$PCA2)
[1] "factor"

为什么其他列也不是数字的?

我知道如何转换列,但我希望我的脚本能够在不手动转换类型的情况下工作。为什么 R 不能识别数字列?

【问题讨论】:

标签: r


【解决方案1】:

正如@MrFlick 所说:数字太多。

您可以通过指定 colClasses 参数来强制执行您想要的:

read.table("test.csv",
                sep=";",
                header=TRUE,
                colClasses=c("integer","numeric","numeric","numeric"))

如果您确实需要尽可能高的精度:

require(data.table)
d <- fread("test.csv")

然后修改到存储的最大精度:

d[,PCA0 := sprintf("%.15E",PCA0)]
d[,PCA1 := sprintf("%.15E",PCA1)]
d[,PCA2 := sprintf("%.15E",PCA2)]

给予:

> d
   id                   PCA0                   PCA1                  PCA2
1:  1  6.142741644872954E+00  1.207589802060825E+00    1.8946959360032403   
2:  2 -5.329026419681557E-01 -8.586870627925729E+00     4.510113575138726

注意:fread 应该更聪明 + 更快。

【讨论】:

    【解决方案2】:

    这是 R 3.1 中的一项更改。关于这个有much discussion on the R-devel list。基本上,如果一个数字的位数太多,它就会转换为一个因子。这种行为应该会在 3.1.1 中恢复,但据我所知尚未设置发布日期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2017-03-11
      • 2017-06-09
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多