写在前面
本人研究生在读,利用一些零碎的时间,学习R,分享学习摘抄笔记的目的:
- 为了防止三天打鱼,两天晒网,激励自己学习下去。
- 作为菜鸟,学习中难免有些疑问,帮助别人,帮助自己。
- 方便将来自己查阅。
- 认识些朋友,生活更有趣些。
如有问题,欢迎指正,毕竟是一个提升自我的过程。
数据集
数据分析的第一步就是按照个人要求,创建含有研究信息的数据集。R中,这个任务分为两步:
- 选择一种数据结构来储存数据
- 将数据输入或导入到数据结构中
什么是数据集?数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。R拥有许多用于存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表。
R中的数据结构
向量
向量是用于储存数值型,字符型或逻辑数据的一维数组。用函数从c( )来创建向量,如下:
a <- c(1,2,3,4,0,-1,-2)
b <- c("one","two","three")
c <- c(TRUE,FALSE,FALSE,TURE)
注意:同一向量中无法混杂其它模式的元素,并且,我们可以利用下列命令获取相应的元素。
> a <- c(1,2,3,4,0,-1,-2)
> a []
[1] 1 2 3 4 0 -1 -2
> a [3]
[1] 3
> a [c(2:5)]
[1] 2 3 4 0
矩阵
矩阵是一个二维数组,每个元素有一个相同的模式(数值型、字符型或逻辑型),可以通过函数matrix来创建矩阵。一般格式如下:
Joshmatrix <- matrix(vector, #包含了矩阵的元素
nrow=number_of_rows,ncol=number_of_columns, #nrow和ncol指定行和列的维数
byrow=logical_value #表明矩阵按列填充(byrow=FALSE)还是按行填充(byrow=TRUE),默认按列填充。
> y <- matrix(1:20,nrow = 5,ncol = 4) #创建一个5行4列的矩阵,默认按列填充。
> y
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
> cells <- c(1,26,21,65)
> rnames <- c("R1","R2")
> cnames <- c("C1","C2")
> mymatrix <- matrix(cells,nrow = 2,ncol = 2,byrow = TRUE,dimnames = list(rnames,cnames)) #创建了2行2列含行名列名标签的矩阵,并按行填充
> mymatrix
C1 C2
R1 1 26
R2 21 65
> mymatrix[1,] #矩阵下标的使用
C1 C2
1 26
> mymatrix[,2]
R1 R2
26 65
> mymatrix[1,2]
[1] 26
数组
数组(array)的维度可以大于2,可以利用函数array( )创建。
myarray <- array(vector #包含数组中的数据
dimensions #数值型向量,给出各维度下标的最大值
dimnames #可选的、各维度名称标签列表)
> dim <- c("A1","A2")
> dim2 <- c("B1","B2","B3")
> dim3 <- c("C1","C2","C3","C4")
> z <- array(1:24,c(1,2,3),dimnames = list(dim,dim2,dim3))
Error in array(1:24, c(1, 2, 3), dimnames = list(dim, dim2, dim3)) :
length of 'dimnames' [1] not equal to array extent
> z <- array(1:24,c(2,3,4),dimnames = list(dim,dim2,dim3)) #一个创建三维(2×3×4)数值型数组
> z
, , C1
B1 B2 B3
A1 1 3 5
A2 2 4 6
, , C2
B1 B2 B3
A1 7 9 11
A2 8 10 12
, , C3
B1 B2 B3
A1 13 15 17
A2 14 16 18
, , C4
B1 B2 B3
A1 19 21 23
A2 20 22 24
> z[1,2,2] #选取元素
[1] 9
数据框
由不同的列可以包含不同模式(数值型、字符型等)的数据组成。数据框可通过函数data.frame( )创建。
mydata <- data.frame(col1,col2,col3,...) #列向量col1,col2,col3,...可以为任何类型(字符型、数值型或逻辑型)
利用数据框图示列表完成。

> 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,Type1)
Error: object 'Type1' not found
> Diabetes <- c(Type1,Type2,Type1,Type1)
Error: object 'Type1' not found
> Diabetes <- c("Type1","Type2","Type1","Type1") # 感觉新手经常犯的错误,比如我,**字符型加引号**
> Status <- c("Poor","Improved","Excellent","Poor")
> Patientdata <- data.frame(PatientID,AdmDate,Age,Diabetes,Status)
> Patientdata #并非自己预期的结果
PatientID AdmDate Age Diabetes Status
1 1 0.0003318401 25 Type1 Poor
2 2 0.0054753609 34 Type2 Improved
3 3 0.0002370286 28 Type1 Excellent
4 4 0.0001777715 52 Type1 Poor
> AdmDate <- c("10/15/2009","11/01/2009","10/21/2009","10/28/2009")
> Patientdata #需重新运行一下,不然就是这样的结果
PatientID AdmDate Age Diabetes Status
1 1 0.0003318401 25 Type1 Poor
2 2 0.0054753609 34 Type2 Improved
3 3 0.0002370286 28 Type1 Excellent
4 4 0.0001777715 52 Type1 Poor
> Patientdata <- data.frame(PatientID,AdmDate,Age,Diabetes,Status)
> Patientdata #成功!
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 Type1 Poor
小track:倘若每次调取如上Patientdata中的元素时,每次都要输入数组的名称,会有些麻烦,这里可以利用函数attach()与detach();with()以减少输入,并使其看起来简洁。
> attach(Patientdata) #将数据框添加到R的搜索路径中
The following objects are masked _by_ .GlobalEnv: #这里,出现了mask,即这个数据框的一些变量与环境变量发生重复,且原始对象有优先权。这时用函数with()会好一点。
AdmDate, Age, Diabetes, PatientID, Status
> with(Patientdata,{
+ c(PatientID,Age,Status)
+ })
[1] 1 2 3 4 25 34 28 52 3 2 1 3 #这里的Status显示的结果,并没有看明白,看起来默认的给我排了个序。存疑
- 因子
变量可以分为名义型、有序型和连续型变量。
> Patientdata
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 Type1 Poor
图中所示,Diabetes 为名义型变量,即没有顺序之分。Status为有序型变量,有顺序之分,如病人状态的好坏,但是这里我们不知道,病人状态好坏具体相差多少。而Age和AdmData是连续型变量,它可以为我们呈现某个范围的任意值,有顺序,有数量。
我们将名义型(类别)变量和有序型(有序类别)称为因子。 #为什么要搞个因子的感念?
针对名义型(类别)变量,可用factor()函数进行赋值,具体复制根据字母顺序而定。
> Diabetes <-factor(Diabetes)
> Diabetes
[1] Type1 Type2 Type1 Type1
Levels: Type1 Type2
> str(Diabetes)
Factor w/ 2 levels "Type1","Type2": 1 2 1 1 #可以看到变化,内部关联为1=Type1,2=Type2
而对于有序型变量,需要函数factor()指定参数ordered=TURE:
> Status <- factor(Status,ordered = T)
> Status
[1] Poor Improved Excellent Poor
Levels: Excellent < Improved < Poor #默认按照字母顺序排列,恰好和逻辑顺序一致
> str(Status)
Ord.factor w/ 3 levels "Excellent"<"Improved"<..: 3 2 1 3
##若逻辑顺序和字母顺序不一致,可用level选项覆盖默认排序
> A <- c("Ailing","Improved","Excellent","Ailing")
> A <- factor(A,ordered = T)
> A
[1] Ailing Improved Excellent Ailing
Levels: Ailing < Excellent < Improved
> str(A)
Ord.factor w/ 3 levels "Ailing"<"Excellent"<..: 1 3 2 1
> str(Patientdata) #函数str(object)可提供R中某个对象(本例中为数据框)的信息。它清楚地显示diabetes是一个因子,而status是一个有序型因子,以及此数据框在内部是如何进行编码的。
'data.frame': 4 obs. of 5 variables:
$ PatientID: num 1 2 3 4
$ AdmDate : Factor w/ 4 levels "10/15/2009","10/21/2009",..: 1 4 2 3
$ Age : num 25 34 28 52
$ Diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 1
$ Status : Factor w/ 3 levels "Excellent","Improved",..: 3 2 1 3
> summary(Patientdata) #函数summary()会区别对待各个变量。它显示了连续型变量age的最小值、最大值、均值和各四分位数,并显示了类别型变量diabetes和status(各水平)的频数值。
PatientID AdmDate Age Diabetes Status
Min. :1.00 10/15/2009:1 Min. :25.00 Type1:3 Excellent:1
1st Qu.:1.75 10/21/2009:1 1st Qu.:27.25 Type2:1 Improved :1
Median :2.50 10/28/2009:1 Median :31.00 Poor :2
Mean :2.50 11/01/2009:1 Mean :34.75
3rd Qu.:3.25 3rd Qu.:38.50
Max. :4.00 Max. :52.00
列表
列表中是R数据类型中比较复杂一种。一般来说,列表是一些对象的有序集合。如某个列表中含有 若干向量,矩阵,数据框,甚至其他列表的组合。可用函数list( )创建列表
> g <- "My First List"
> h <- c(25,26,18,39)
> j <- matrix(1:10,nrow = 5)
> k <- c("one","two","three")
> mylist <- list(title = g,ages = h,j,k) #建一个列表并将其命名
> mylist
$title
[1] "My First List"
$ages
[1] 25 26 18 39
[[3]]
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
[[4]]
[1] "one" "two" "three"
> mylist[[2]] #获取其中的元素
[1] 25 26 18 39
> mylist[["ages"]]
[1] 25 26 18 39
数据的输入
R可从键盘、文本文件、Microsoft Excel和Access、流行的统计软件、特殊格式的文件,以及多种关系型数据库中导入数据。由于作为菜鸟的自己并未真正实战过,故此主要介绍从键盘,带分隔符的文本文件,Excel文件和网页中抓入的数据导入R中。
键盘输入
若要从键盘中输入数据到R,则需要一下步骤:
* 创建一个空数据框(矩阵),其变量和变量的模式需要与理想中的最终数据一致;
* 针对这个数据对象,调用文本编辑器(函数edit( )),输入的你数据,并将结果保存回此数据结构中。
> mydata <- data.frame(age = numeric(0), #建一个名为mydata的表格,包含age(数值型),gender(字符型),weight(数值型)。类似于numeric(0)的赋值语句,将创建一个指定的模式,但不含实际数据的变量
+ gender = character(0),weight = numeric(0))
> mydata <- edit(mydata) #有一个如下的表格

带分隔符的文本文件
使用函数read.table( )从带分隔符的文本文件中导入数据,它可读入一个表格格式的文件并将其保存为一个数据框。
> mydataframe <- read.table(file,header = logical_value, #file是一个带分隔符的ASCⅡ文本文件,header是一个表明首行是否包含了变量的逻辑值(T或F)
+ sep = "delimiter",row.name = "name") #sep用来指定分割数据的分隔符,row.names是一个可选的参数,用于一个或多个表示行标识的变量。
我就做了一波尝试,看看具体怎么用。先找了一个excel文件,将其导出为一个逗号文件(csv)。将该逗号文件放置自己当前R中的工作目录中,使用下面命令操作。
> getwd() #获取当前工作目录
[1] "C:/Users/Josh/Documents"
> students <- read.table("students.csv",header = T,sep = ",") #参数sep允许你导入那些使用逗号以外的符号来分隔行内数据的文件。你可以使用sep="\t"读取以制表符分隔的文件。此参数的默认值为sep="",即表示分隔符可为一个或多个空格、制表符、换行符或回车符
> students
学院 班级 学号 考生号 姓名
##有具体数字内容,不方便给大家看了。
摘自《R语言实战》一书
网友评论