0

我正在使用read.table读取数据文件。并得到以下错误:

扫描错误(文件,什么,nmax,sep,dec,quote,skip,nlines,na.strings,:
scan()预期'a real',得到'true'

我知道这意味着我的数据文件中有一些错误,问题是我怎样才能找到它在哪里。错误消息没有告诉哪一行有问题,我很难找到它。或者我怎样才能跳过这些行?

这是我的R代码:

data<-read.csv("/home/jianfezhang/prod/conversion_yaap/data/part-r-00000",
                   sep="\t",
                   col.names=c("site",
                               "treatment",
                               "mode",
                              "segment",
                              "source",
                              "itemId",
                              "leaf_categ_id",
                              "condition_id",
                              "auct_type_code",
                              "start_price_lstg_curncy",
                              "bin_price_lstg_curncy",
                              "start_price_variance",
                              "start_price_mean",
                              "start_price_media",
                              "bin_price_variance",
                              "bin_price_mean",
                              "bin_price_media",
                              "is_sold"),
                   colClasses=c(rep("factor",5),"numeric",rep("factor",3),rep("numeric",8),"factor")
                   );
4

1 回答 1

3

您得到的错误是由colClasses参数引起的 - 文件中的某些值与您指定的数据类型不匹配。

大多数时候我遇到这样的事情,我可能只是在colClasses争论中遇到了一些计数问题,例如它可能是

colClasses=c(rep("factor",5),"numeric", rep("factor",4), rep("numeric",7),"factor")

而不是您的默认值。这可以通过仔细比较文件第一行的内容与您指定的数据类型来简单地检查。

如果这对您不起作用,那么您可能有一些您不期望的错误数据类型。一个简单但缓慢的方法是删除colClasses参数并首先读取整个文件而不使用特定选项 - 可能添加stringsAsFactors=FALSE以仅获取字符值。这可能应该工作。

然后你可以尝试一一转换每一列,比如

data$itemId <- as.numeric(data$itemId)

然后检查结果的NA值,很容易通过summary(data$itemId). 如果您有NA值,您可以调用which(is.na(data$itemId))以获取行号并检查您的原始文件NA实际上是否有效,或者您是否有一些数据问题。

大多数情况下,您可以通过这种方式缩小问题范围。

但是,如果您的文件有很多列,这很快就会变成很多工作......

于 2013-06-04T07:15:06.693 回答