将一些colClasses设置为整数时,read.table会在看到引用的字段值时发出抱怨

时间:2015-09-23 16:08:32

标签: r import data.table read.table read.csv

我使用Lending Club的历史贷款数据集来学习R.这里有代表性的数据子集:https://gist.github.com/adetch/11b1c2b6eac0b6add23f

有问题的命令:

problem <- read.csv("test.csv",na.strings=c("","<NA>"),colClasses=c("mths_since_last_major_derog"="integer"))

我遇到的错误:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
scan() expected 'an integer', got '""'

我使用以下命令遇到了类似的问题:

problem <- read.csv("test.csv",na.strings=c("","<NA>"),colClasses=c("id"="integer"))

这种情况下的错误:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
scan() expected 'an integer', got '"1077501"'

所以在我看来似乎

  • R&#39; integer类与引号不兼容
  • 并且可能在扫描类之后运行na.strings转换,并且integer检查在空字符串上失败。

但是,""中包含的其他列(例如member_idloan_amnt)会在没有投诉的情况下被投射为integer(并且没有使用colClasses进行任何特殊干预!)。

最近的问题:

  • 如何将这些字段(idmths_since_last_major_derog)转换为整数,而不是因子(注意 应该将其作为因素投射的众多其他字段)< / LI>

更重要的是:

  • R类的心理模型,类胁迫,read.table / read.csv等在哪里崩溃?

1 个答案:

答案 0 :(得分:0)

请勿使用colClasses。如果你真的需要强制,那么按原样阅读,然后use$id <- as.integer(problem$id)

但在这种情况下(你的test.csv)我认为R非常擅长加载数据。

修改

重新迭代。想象一下,有一个包含3列的简单数据表:

id,member_id,term
1077501,1296599,36 months
1077430,1314167,60 months
1077175,1313524,36 months
1076863,1277178,36 months

如果您通过

加载数据
d <- read.csv("c:/temp/R/data.csv")

然后R将尽力匹配数据类型。 如果您真的想要提前告诉它,请使用colClasses;如果你说像

那样的话
d <- read.csv("c:/temp/R/data.csv", colClasses = c("integer"))

然后它会尝试为每个列使用类integer,因为它重复 colClasses向量。

相同的问题
d <- read.csv("c:/temp/R/data.csv", colClasses = c("integer","character"))

尝试将第一列加载为colClasses[1],即整数 - 确定。

尝试将第二列加载为colClasses[2],即字符 - 确定。

尝试加载第3列 - 因为没有colClasses[3]然后回收 colClasses并返回colClasses[1] - 这不起作用(R不知道如何将“36个月”强制为整数值)

<强> EDIT2

在实际查看数据集之后,问题是您的列没有任何值,并且仅存储""。 因此,您需要将""添加到na.string,这样才能解决问题: (即你需要逃避",你的实际字符串将是"\"\""

problem <- read.csv("c:/temp/R/test.csv",na.strings=c("\"\"","","<NA>"),colClasses=c("mths_since_last_major_derog"="integer"))