二(续):数据的录入R与统计
Posted 是璇子鸭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二(续):数据的录入R与统计相关的知识,希望对你有一定的参考价值。
引言
通过上一文的学习,我们已经掌握了各种数据结构,可以放一些数据到R中去了。但当涉及数据分析时,我们不得不面对来自多种数据源和数据格式的数据。而我们的任务是将这些数据导入到自己的工具去分析数据,进而汇报分析结果。
因此,本文将讨论各数据源数据导入到R的方法,大家按需阅读即可。
文章主要参考了《R语言实战.第2版》、B站系列课程《R语言入门与数据分析》 ,并结合自己的经验总结而成。
注:
- R提供了适用范围广泛的数据导入工具。向R中导入数据的权威指南参见可在
http://cran.r-project.org/doc/manuals/R-data.pdf下载的R Data Import/Export手册。
2.强烈推荐想要系统性学习R的朋友购买《R语言实战》(目前出到第二版)
一、使用键盘输入数据
使用键盘输入数据算是最简单的直观的,其常见有两种方式:①直接在代码中嵌入数据和②用R内置的文本编辑器。
①直接在代码中嵌入数据
patientID <- c(1,2,3,4)
> admdate <- c('10/15/2009','11/01/2009','10/21/2009','10/28/2009')
> age <- c(25,34,28,52)
> diabetes <- c('Type1','Type2','Type1','Type2')
> status <- c('poor','improved','excellent','poor')
#利用dataframe
> data <- data.frame(patientID,admdate,age,diabetes,status)
> data
patientID admdate age diabetes status
1 1 10/15/2009 25 Type1 poor
2 2 11/01/2009 34 Type2 improved
3 3 10/21/2009 28 Type1 excellent
4 4 10/28/2009 52 Type2 poor
②用R内置的文本编辑器
R中的函数edit()会自动调用一个允许手动输入数据的文本编辑器。具体步骤如下:
(1) 创建一个空数据框(或矩阵),其中变量名和变量的模式需与理想中的最终数据集一致;
(2) 针对这个数据对象调用文本编辑器,输入你的数据,并将结果保存回此数据对象中。
> data2 <- data.frame(patientID = character(0),admdate = character(0),age = numeric(),diabetes = character(),status = character())
> data2 <- edit(data2)#利用edit生成表格在线录入
> fix(data2)#用fix修改数据
注意,编辑的结果需要赋值回对象本身(此处为"data2")。函数edit()事实上是在对象的一个副本上进行操作的。如果你不将其赋值到一个目标,你的所有修改将会全部丢失!
如上图,直接在其中自主输入数据即可。
以上方法适用于数据量较小的情况,当数据量很大时,用键盘输入显然是不现实的。此时采用2(先利用其他软件预处理数据,这样便于用R进行后续的操作,更便捷)。
二、通过读取存储在外部文件上的数据
1.纯文本文件读取
- 文件一定要在当前工作路径下才能被读取
- .txt(空白分割) #保存时,将光标移动至最下方,以避免最后一行导入不完整的警告
- .csv(‘,’分割) #导入时,用sep = ‘,'来更好显示文件
> setwd(dir = 'C:/Users/Administrator/Documents/RData/')
#更改当前路径,或者在Rstudio右下角的file栏,找到目标文件,利用more来直接设置当前工作路径
> getwd()
[1] "C:/Users/Administrator/Documents/RData"
#检查当前工作路径
我们使用read.table()来导入文本文件中的数据。此函数可读入一个表格格式的文件并将其保存为一个数据框。表格中的每一行分别对应文本中的每一行,其语法如下:
mydataframe <- read.table(file, options)
其中,file是一个带分隔符的ASCII文本文件,options是控制如何处理数据的选项。下表列出了常见的选项。(图片来源:《R语言实战》)
为便于理解,下面给出一些示例:
> x <- read.table('hahah.txt')#读取文本文件
> x
V1 V2 V3
1 ID name sex
2 1 shelly 1
3 2 hsiwe 0
> head(x)#显示文件前几行(默认为前6行)
V1 V2 V3
1 ID name sex
2 1 shelly 1
3 2 hsiwe 0
> tail(x, n = 2)#显示文件最后两行
V1 V2 V3
2 1 shelly 1
3 2 hsiwe 0
> x <- read.table('score.csv',fileEncoding = 'utf8',sep = ',',header = TRUE)
#csv文件读取,sep识别分隔符,header = TRUE显示表头,fileEncoding为编码
> head(x)#默认读取前六行
judge1 judge2 judge3 judge4 judge5 judge6 judge7 judge8
1 7.3 8.0 7.1 7.7 7.2 7.2 7.0 7.6
2 7.8 8.7 7.2 8.4 7.5 8.1 7.3 7.1
3 7.2 7.4 7.1 7.5 7.2 7.1 7.0 7.0
4 7.3 8.4 7.2 7.9 7.5 8.5 7.3 7.1
5 7.7 7.8 7.2 8.4 7.6 7.4 7.1 7.1
6 7.3 7.6 7.2 8.1 7.3 7.2 7.0 7.0
> read.table('score.csv',header = TRUE,skip = 290)#从第290行开始读取
9.2.9.5.8.7.9.6.8.2.9.6.8.8.8.8
#这里第一排被识别为表头(header)
1 8.3,8.7,7.9,9.1,8.4,9.5,8.4,9.2
2 7.8,8.7,7.5,8.3,7.4,8.4,7.4,7.3
3 9.8,9.9,9.6,9.9,9.1,10,9.8,9.9
4 7.9,8.4,7.5,8.5,7.9,8.2,7.5,7.1
5 9,9.4,8.7,9.6,8.4,9.7,8.7,7.9
6 8.4,9.2,8,9,7.9,9.2,8.4,8.2
7 9.7,9.6,9.2,9.5,8.9,9.5,9.4,10
8 7.3,7.6,7.1,7.7,7.1,7.1,7,7.7
9 7.8,8.2,7.5,8.2,7.4,7.6,7.2,7
10 8.4,9.2,8.1,9.3,7.7,8.4,7.7,9.8
#nrow控制读取到哪里,skip控制从哪一行开始读,na.strings标注缺失值
默认地,read.table()把字符变量转化成因子,这并不一定都是我们想要的情况。此时,我们可使用colClasses选项对每一列都指定一个类(如:逻辑型、数值型、字符型或因子型。)
grades <- read.table("studentgrades.csv", header=TRUE,
row.names="StudentID", sep=",",
colClasses=c("character", "character", "character",
"numeric", "numeric", "numeric"))
得如下数据框:
> grades
First Last Math Science Social.Studies
011 Bob Smith 90 80 67
012 Jane Weary 75 NA 80
010 Dan Thornton, III 65 75 70
040 Mary O'Leary 90 95 92
> str(grades)
'data.frame': 4 obs. of 5 variables:
$ First : chr "Bob" "Jane" "Dan" "Mary"
$ Last : chr "Smith" "Weary" "Thornton, III" "O'Leary"
$ Math : num 90 75 65 90
$ Science : num 80 NA 75 95
$ Social.Studies: num 67 80 70 92
函数read.table()还拥有许多微调数据导入方式的追加选项。更多详情,可参阅help(read.table)。
2.导入Excel数据
个人认为读取Excel文件最直接简单的方式就是将其导出为csv文件,再用上述的read.table()将其导入到R中去。
此外,当然也可以用xlsx包直接地导入Excel工作表。请确保在第
一次使用它之前先进行下载和安装。你也需要xlsxjars和rJava包,以及一个正常工作的Java安装(http://java.com)。
为便于说明,下有示例:
现在有一Excel文件如下,位置为:C:\\Users\\Administrator\\Documents,且数据在第一个工作表。(例子笔者随便举的,不用在意具体含义)
故我们通过如下操作将其导入至R:
1.设置当前路径
使用“setwd()”,或在Rstudio右下角的file栏,找到目标文件,利用more来直接设置当前工作路径,详见前
2.载入相关包
library(rJava)
> library(xlsxjars)
> library(xlsx)
3.文件读取
workbook <- "score.xlsx"
> data <- read.xlsx(workbook,1,header=T,encoding = 'utf8')
> data #默认为数据框
num name grade
1 12 shwehw 88
2 56 udw 99
3 7 dbje 85
对于大型工作簿(如100000+个单元格)也可使用read.xlsx2()函数。该函数用Java来运行更加多的处理过程,因此可获得可观的质量提升。
欲知更多细节,请查阅help(read.xlsx)。
剪切板数据的读取
> x <- read.table('clipboard',header = TRUE,sep = ',')
> x
judge1.judge2.judge3.judge4.judge5.judge6.judge7.judge8
1 7.3\\t8\\t7.1\\t7.7\\t7.2\\t7.2\\t7\\t7.6
2 7.8\\t8.7\\t7.2\\t8.4\\t7.5\\t8.1\\t7.3\\t7.1
3 7.2\\t7.4\\t7.1\\t7.5\\t7.2\\t7.1\\t7\\t7
4 7.3\\t8.4\\t7.2\\t7.9\\t7.5\\t8.5\\t7.3\\t7.1
5 7.7\\t7.8\\t7.2\\t8.4\\t7.6\\t7.4\\t7.1\\t7.1
6 7.3\\t7.6\\t7.2\\t8.1\\t7.3\\t7.2\\t7\\t7
7 8.3\\t8.3\\t7.7\\t8.5\\t7.8\\t7.8\\t7.2\\t7.8
8 9.6\\t9.8\\t9.3\\t9.8\\t8.8\\t9.9\\t9.4\\t10
9 9.1\\t8.8\\t8.6\\t9.1\\t7.8\\t9.3\\t8.5\\t8.5
10 9.5\\t9.7\\t9\\t9.6\\t8.9\\t9.8\\t9.2\\t10
> #如果包含clipboard文本文件,就需要使用sep参数等于该文件(\\t),否则默认为读取剪切板内容
> x <- read.table('clipboard',header = TRUE,sep = '\\t')
> x
judge1 judge2 judge3 judge4 judge5 judge6 judge7 judge8
1 7.3 8.0 7.1 7.7 7.2 7.2 7.0 7.6
2 7.8 8.7 7.2 8.4 7.5 8.1 7.3 7.1
3 7.2 7.4 7.1 7.5 7.2 7.1 7.0 7.0
4 7.3 8.4 7.2 7.9 7.5 8.5 7.3 7.1
5 7.7 7.8 7.2 8.4 7.6 7.4 7.1 7.1
6 7.3 7.6 7.2 8.1 7.3 7.2 7.0 7.0
7 8.3 8.3 7.7 8.5 7.8 7.8 7.2 7.8
8 9.6 9.8 9.3 9.8 8.8 9.9 9.4 10.0
9 9.1 8.8 8.6 9.1 7.8 9.3 8.5 8.5
10 9.5 9.7 9.0 9.6 8.9 9.8 9.2 10.0
#直接读取剪切板
> readClipboard()
[1] "judge1\\tjudge2\\tjudge3\\tjudge4\\tjudge5\\tjudge6\\tjudge7\\tjudge8"
[2] "7.3\\t8\\t7.1\\t7.7\\t7.2\\t7.2\\t7\\t7.6"
[3] "7.8\\t8.7\\t7.2\\t8.4\\t7.5\\t8.1\\t7.3\\t7.1"
[4] "7.2\\t7.4\\t7.1\\t7.5\\t7.2\\t7.1\\t7\\t7"
[5] "7.3\\t8.4\\t7.2\\t7.9\\t7.5\\t8.5\\t7.3\\t7.1"
[6] "7.7\\t7.8\\t7.2\\t8.4\\t7.6\\t7.4\\t7.1\\t7.1"
[7] "7.3\\t7.6\\t7.2\\t8.1\\t7.3\\t7.2\\t7\\t7"
[8] "8.3\\t8.3\\t7.7\\t8.5\\t7.8\\t7.8\\t7.2\\t7.8"
[9] "9.6\\t9.8\\t9.3\\t9.8\\t8.8\\t9.9\\t9.4\\t10"
[10] "9.1\\t8.8\\t8.6\\t9.1\\t7.8\\t9.3\\t8.5\\t8.5"
导入XML数据
参阅文档:www.omegahat.org/RSXML
从网页抓取数据
相关资料:
- 网站Programming with R(www.programmingr.com)上的“Webscraping using readLines and RCurl”一文。
- CRAN Task View中的子版块Web Technologies and Services(https://cran.r-project.org/web/views/WebTechnologies.html)来获得一个全面的列表,此列表列出了能帮助你获取网上资源的各种R包。
其他(如SPSS\\SAS等)
这里每个人的情况不一样,所以就不具体赘述了。大家可根据自己的需求查询foreign包中的相关操作。
> help(package = "foreign")
> RSiteSearch('SPSS') #读取其他软件处理后的文件(eg: matlab, SPSS)
檢索查詢疑問已被提交给http://search.r-project.org
计算结果应很快就在瀏覽器里打开
三、通过访问数据库系统来获取数据
这一部分,因为笔者自己经验不足,下面内容均来自《R语言实战》
R中有多种面向关系型数据库管理系统(DBMS)的接口,包括Microsoft SQL Server、Microsoft Access、mysql、Oracle、PostgreSQL、DB2、Sybase、Teradata以及SQLite。其中一些包通过原生的数据库驱动来提供访问功能,另一些则是通过ODBC或JDBC来实现访问的。使用R来访问存储在外部数据库中的数据是一种分析大数据集的有效手段,并且能够发挥SQL和R各自的优势。
1.ODBC接口
在R中通过RODBC包访问一个数据库也许是最流行的方式,这种方式允许R连接到任意一种拥有ODBC驱动的数据库,这包含了前文所列的所有数据库。
第一步是针对你的系统和数据库类型安装和配置合适的ODBC驱动——它们并不是R的一部分。如果你的机器尚未安装必要的驱动,上网搜索一下应该就可以找到。
针对选择的数据库安装并配置好驱动后,请安装 RODBC 包。你可以使用命令install.packages(“RODBC”)来安装它。RODBC包中的主要函数列于表2-3中。
RODBC包允许R和一个通过ODBC连接的SQL数据库之间进行双向通信。这就意味着你不仅可以读取数据库中的数据到R中,同时也可以使用R修改数据库中的内容。
假设你想将某个数据库中的两个表(Crime和Punishment)分别导入为R中的两个名为crimedat和pundat的数据框,可以通过如下代码完成这个任务:
library(RODBC)
myconn <-odbcConnect("mydsn", uid="Rob", pwd="aardvark")
crimedat <- sqlFetch(myconn, Crime)
pundat <- sqlQuery(myconn, "select * from Punishment")
close(myconn)
这里首先载入了RODBC包,并通过一个已注册的数据源名称(mydsn)和用户名(rob)以及密码(aardvark)打开了一个ODBC数据库连接。连接字符串被传递给sqlFetch(),它将Crime表复制到R数据框crimedat中。然后我们对Punishment表执行了SQL语句select并将结果保存到数据框pundat中。最后,我们关闭了连接。
函数sqlQuery()非常强大,因为其中可以插入任意的有效SQL语句。这种灵活性赋予了你选择指定变量、对数据取子集、创建新变量,以及重编码和重命名现有变量的能力。
2.DBI相关包
DBI包为访问数据库提供了一个通用且一致的客户端接口。构建于这个框架之上的RJDBC包提供了通过JDBC驱动访问数据库的方案。
使用时请确保安装了针对你的系统和数据库的必要JDBC驱动。其他有用的、基于DBI的包有RMySQL、ROracle、RPostgreSQL和RSQLite。这些包都为对应的数据库提供了原生的数据库驱动,但可能不是在所有系统上都可用。
详情请参阅CRAN(http://cran.r-project.org)上的相应文档。
补充:值标签
函数factor()可为类别型变量创建值标签。假设你有一个名为gender的变量,其中1表示男性,2表示女性。你可以使用代码:
patientdata$gender <- factor(patientdata$gender,
levels = c(1,2),
labels = c("male", "female"))
来创建值标签。
这里levels代表变量的实际值,而labels表示包含了理想值标签的字符型向量。
处理数据对象的实用函数
以上是关于二(续):数据的录入R与统计的主要内容,如果未能解决你的问题,请参考以下文章
九月班|报一赠二数据分析与R语言制图实战班(9.22-25)