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格式的数据,数据如下:
但当我输入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
关于数据的读入问题,看似是一个很简单的问题,但又是一个经常出错的问题。如果可以掌握数据读入的几个主要问题,总结出错的原因。可以让数据分析更加事半功倍!