12
2015
06

关于R读取文件的几个常错的问题

   R的数据读入灵活方便,可以在R软件中直接输入,也可以读入外部文件。对于大数据量来说,一般需要从外部读入数据,外部的数据源很多,可以是网络、电子表格、数据库、文本文件、论文等形式,所以录入数据的方法也就很多。

  一般来讲,建议用excel等先处理一下数据,然后再用R读入。R可以读入txt, csv, xls, spss, sas等各种格式的数据(具体可参考《R数据分析——方法与案例详解》)。主要几个函数如下:

read.table(file, header = FALSE, sep = "", quote = "\"'",
           dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),
           row.names, col.names, as.is = !stringsAsFactors,
           na.strings = "NA", colClasses = NA, nrows = -1,
           skip = 0, check.names = TRUE, fill = !blank.lines.skip,
           strip.white = FALSE, blank.lines.skip = TRUE,
           comment.char = "#",
           allowEscapes = FALSE, flush = FALSE,
           stringsAsFactors = default.stringsAsFactors(),
           fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)

read.csv(file, header = TRUE, sep = ",", quote = "\"",
         dec = ".", fill = TRUE, comment.char = "", ...)

read.csv2(file, header = TRUE, sep = ";", quote = "\"",
          dec = ",", fill = TRUE, comment.char = "", ...)

read.delim(file, header = TRUE, sep = "\t", quote = "\"",
           dec = ".", fill = TRUE, comment.char = "", ...)

read.delim2(file, header = TRUE, sep = "\t", quote = "\"",
            dec = ",", fill = TRUE, comment.char = "", ...)


但是相信很多R用户在读入数据时都碰到过数据读入出错的问题。出错的原因很多,但是90%以上的原因主要是编码和TAB分隔问题。尤其容易出现在不用语言环境和不同操作系统中。

  (一)编码问题

 首先了解一下编码问题。编码问题或者乱码问题主要是由于不同语言转换所造成的。由于计算机最早诞生于西方,西方的语言主要是拉丁字符,有一个标准的编码ISO-8859系列,仅支持西方拉丁字符,并不包含中文字符。西方很多软件的开发都是基于该系列,当使用中文字符的时候往往会出现乱码问题。为了解决不同文字的编码问题,计算机界在国际上的支持主要通过Unicode系列编码进行的,就是统一编码的意思。Unicode有很多变种,其中常见的就是UTF-8编码,UTF-16。UTF-8编码是很多操作系统的默认编码,比如Uninx/Linux/Mac OSX等。中文Windows当然也支持这种编码,但UTF-8并不是默认的编码。

   比如我要读入csv格式的数据,数据如下:

201506121434046306983276.png

但当我输入R代码时:


> dat_ID<-read.csv(file="dataID.csv",header=T,sep=";")

Error in type.convert(data[[i]], as.is = as.is[i], dec = dec, numerals = numerals,  : 

  '<ca><c7>'多字节字符串有错

结果出错,显示”多字节字符串有错“。这个就是典型的编码问题。这个时候我们可以把csv格式转成 UTF编码。在 另存为->选取UTF(txt)格式保存。

然后用如下代码

dat_ID<-read.table(file="dataID2.txt",header=T,sep="\t",fileEncoding="UTF-16")

就可以成功读取了。


(二)分隔符问题

用R读入数据时,读入的时候没显示出错,数据是读进去了,但是把数据捞出来看时,却发现问题了,数据没有自动分列,而成一整行的。也就是说数据没有分开,这就是分隔符的问题。

比如:


> dat<-read.csv(file="DATA2013.csv",header=T,sep=";")

> dim(dat)

[1] 1289    1

> head(dat)

                                                                                                                                                                                                       X.ID.V3.V11.V13.V19.V20.V25.V27.V31.V39.V40.V41.V42.V43.V44.V48.V49.V50.V52.V54.V55.V56.V57.V58.V59.V60.V61.V64.V65.V66.V67.V68.V70.V71.V72.V73.V74.V75.V76.V77.V78.V79.V80.V81.V82.V83.V84.V85.V86.V87.V88.D2013.y

1 1,000002.SZ,33267,9676185190,9700013451,8057090424,87.8458,14.7,22.3,741806,0.9481,20812392740,2.14497e+11,6.4879,1.2955,23.7389,0.8578,88450200420,64698436105,7.3457,1.2143,1.37,6.98,0.175,12.2941,-0.7368,21.4872,5.8383,4.2651,13.5118,99.8778,95.7421,0.4015,77.997,4.5448,92.2458,88.0021,1.3439,0.3372,0.1349,4.8607,11.7939,1143.6817,54.5437,0.3365,0.3166,0.3157,1.7055,20.1754,26.5056,26.5056,0.41,-19.3689

这是因为我们读取数据时,分隔符设置的有问题,查看文件发现分隔符是sep=","而不是sep=";"。更改后就可以成功读入数据了。


> dat<-read.csv(file="DATA2013.csv",header=T,sep=",")

> dim(dat)

[1] 1289   53

> head(dat)

  X        ID    V3        V11        V13        V19     V20   V25   V27    V31

1 1 000002.SZ 33267 9676185190 9700013451 8057090424 87.8458 14.70 22.30 741806

2 2 000004.SZ 33252   83875459   83976684   61960792 99.8795 26.10 40.63  11817

3 3 000005.SZ 33217  913743007  914333607  729502562 99.9354 20.15 29.86 110257

4 4 000006.SZ 33721 1338241583 1349995046  656387519 99.1294 20.31 54.83  47038

5 5 000007.SZ 33707  184813141  230965363  144606915 80.0177 17.41 48.16  15074

6 6 000008.SZ 33731  147306236  303601640  113208274 48.5196 62.71 68.47  12563


关于数据的读入问题,看似是一个很简单的问题,但又是一个经常出错的问题。如果可以掌握数据读入的几个主要问题,总结出错的原因。可以让数据分析更加事半功倍!

« 上一篇 下一篇 »