第2章--创建数据集
Posted cyoutetsu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第2章--创建数据集相关的知识,希望对你有一定的参考价值。
按照个人的要求来创建含有被研究信息的数据集,这是做任何数据分析的第一步,这个任务包括以下两步:
- 选择一种数据结构来存储数据;
- 将数据输入或者导入到这个数据结构中。
2.1 数据集的概念
数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。
R中有许多用于存储数据的结构,包括标量、向量、数组、数据框和列表。
R可以处理的数据类型(模式)包括数值型、字符型、逻辑型、复数型和原生型。
2.2 数据结构
R中的一些术语较为独特:
在R中,对象(object)是指可以赋值给变量的任何事物,包括常量,数据结构,函数甚至图形。
因子(factor)是名义型变量或有序型变量。
向量
- 向量是用来存储数值型,字符型或逻辑型数据的一维数组。执行组合功能的函数c()用来创建向量。
> a <- c(1,2,3,4,5,6) > b <- c("one","two","three","four","five","six") > c <- c(TRUE,TRUE,FALSE,TRUE,FALSE)
2.单个向量中的数据必须拥有相同的类型或模式。
3.标量是只含有一个元素的向量。
4.通过在方括号中给定元素所处位置的数值,我们可以访问向量中的元素。
> a <- c(1,2,3,4,5,6) > a[3] [1] 3 > a[c(1,3,5)] [1] 1 3 5 > a[1:5] [1] 1 2 3 4 5
矩阵
1. 矩阵是一个二维数组,只是每个元素都拥有相同的模式。
可以通过matrix创建矩阵,一般格式为:
matrix(vector, nrow=,ncol=,byrow=logical_value, dimnames=list(char_vector_rownames,char_vector_colnames))
vector包含了矩阵的元素
nrow和ncol用以指定行和列的维数
dimnames包含了可选的以字符型向量表示的行名和列名
byrow则表明矩阵应当按行填充(byrow=TRUE)还是按列填充(byrow=FALSE)(默认)
# 创建一个5x4的矩阵 > y <- matrix(1:20, nrow=5, ncol=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 # 创建一个2x2按行填充的矩阵 > cells <- c(1,26,24,68) > rnames <- c("R1","R2") > cnames <- c("C1","C2") > mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=TRUE,dimnames=list(rnames,cnames)) > mymatrix C1 C2 R1 1 26 R2 24 68 #上面的矩阵按列填充 > mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=FALSE,dimnames=list(rnames,cnames)) > mymatrix C1 C2 R1 1 24 R2 26 68
我们可以使用下标和方括号来选择矩阵中的行、列或元素。
> x <- matrix(1:10, nrow=2) > x [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 > x[2,] [1] 2 4 6 8 10 > x[,2] [1] 3 4 > x[1,4] [1] 7 > x[1,c(4,5)] [1] 7 9
数组
- 数组与矩阵类似,但是维度可以大于2
- 数组可以通过array创建,array(vector,dimensions,dimnames),其中vector包含了数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大值,而dimensions是可选的、各维度名称标签的列表。
> dim1 <- c("A1","A2") > dim2 <- c("B1","B2","B3") > dim3 <- c("C1","C2","C3","C4") > z <- array(1:24, c(2,3,4),dimnames=list(dim1,dim2,dim3)) > 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
数据框
数据框可以通过函数data.frame()来创建
mydata <- data.frame(col1, col2, col3...)
其中的列向量,col1, col2, col3可为任何类型,每一列的名称可由函数names指定。
> patientID <- c(1,2,3,4) > age <- c(25,34,28,52) > diabetes <- c("Type1","Type2","Type1","Type1") > status <- c("Poor","Improved","Excellent","Poor") > patientdata <- data.frame(patientID, age, diabetes, status) > patientdata patientID age diabetes status 1 1 25 Type1 Poor 2 2 34 Type2 Improved 3 3 28 Type1 Excellent 4 4 52 Type1 Poor
选取数据框中的元素:
> patientdata[1:2] patientID age 1 1 25 2 2 34 3 3 28 4 4 52 > patientdata[c("diabetes","status")] diabetes status 1 Type1 Poor 2 Type2 Improved 3 Type1 Excellent 4 Type1 Poor > patientdata$age [1] 25 34 28 52
$是新出现的记号,用来选取一个给定数据框中的某个特定的变量:
> table(patientdata$diabetes,patientdata$status) Excellent Improved Poor Type1 1 0 2 Type2 0 1 0
在每个变量名前都键入一次patientdata$可能会很麻烦,可以联合使用函数attach()和detach()或者单独使用with()来简化代码。
函数attach()可将数据框添加到R的搜索路径中,detach()将数据框从搜索路径中移除。R在遇到一个变量名以后,将检查搜索路径中的数据框,以定位到这个变量。例如:
summary(mtcars$mpg)
plot(mtcars$mpg, mtcars$disp)
plot(mtcars$mpg, mtcats$wt)
可以改写成:
attach(mtcars)
summary(mpg)
plot(mpg, disp)
plot(mpg, wt)
detach(mtcars)
当名称相同的对象不止一个时,这种方法的局限性就很明显了。这两个函数最好是在分析一个单独的数据框,而且不太可能有多个同名对象的时候使用。另一种方式是使用with()。
with(mtcars, {
summery(mpg, disp, wt)
plot(mpg, disp)
plot(mpg, wt)
})
这样的话,就可以仅仅针对大括号内的语句执行了,但是with()函数的局限性在于赋值仅在此函数的括号内生效。如果你需要创建with结构以外存在的对象,使用特殊赋值符号<<-替代标准的赋值符号<-即可,它可以将对象博保存到with()之外的全局环境中。
因子
- 类别变量和有序型变量在R中称为因子。
- 函数factor()以一个整数向量的形式储存类别值,同时一个由字符串组成的内部向量将映射到这些整数上。
- factor(status,order=TRUE,levels=c("level1","level2","level3"))
例如:
> diabetes <- c("Type1","Type2","Type1","Type1") > diabetes <- factor(diabetes) > diabetes [1] Type1 Type2 Type1 Type1 Levels: Type1 Type2
此向量在R中会被储存为(1,2,1,1),并在内部将其关联为1=Type1和2=Type2。针对向量的任何分析都会将其作为名义型变量对待,并自动选择合适这一测量尺度的统计方法。
要表示有序型变量,需要为函数factor()指定参数order=TRUE。如果默认的字母排序不能让人满意,则可以用levels=()来人工排序。
# 以向量的形式输入数据 > patientID <- c(1,2,3,4) > age <- c(25,34,28,52) > diabetes <- c("Type1","Type2","Type1","Type1") > status <- c("Poor","Improved","Excellent","Poor") > diabetes <- factor(diabetes) > status <- factor(status, order=TRUE) > patientdata <- data.frame(patientID, age, diabetes, status) # 显示对象的结构 > str(patientdata) \'data.frame\': 4 obs. of 4 variables: $ patientID: num 1 2 3 4 $ age : num 25 34 28 52 $ diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 1 $ status : Ord.factor w/ 3 levels "Excellent"<"Improved"<..: 3 2 1 3 # 显示对象的统计概要 > summary(patientdata) patientID age diabetes Min. :1.00 Min. :25.00 Type1:3 1st Qu.:1.75 1st Qu.:27.25 Type2:1 Median :2.50 Median :31.00 Mean :2.50 Mean :34.75 3rd Qu.:3.25 3rd Qu.:38.50 Max. :4.00 Max. :52.00 status Excellent:1 Improved :1 Poor :2
列表
- 列表就是一些对象的有序集合。
- 列表允许你整合若干(可能无关的)对象到单个对象名下。
可以使用list创建列表
mylist <- list(object1, object2, ...)
其中对象可以使目前为止讲到的任何结构,还可以为列表中的对象命名:
mylist <- list(name1=object1, name2=object2, ...)
> 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中重要的数据结构。首先,列表允许以一种简单的方式组织和重新调用不相干的信息;其次,许多R函数的运行结果都是以列表的形式返回的。
2.3 数据的输入
1. 使用键盘输入数据
R中的edit()会自动调用一个允许手动输入数据的文本编辑器。
- 创建一个空数据框或矩阵,其中变量名和变量的模式需与理想中的最终数据集一致;
- 针对这个数据对象调用文本编辑器,输入你的数据,并将结果保存回次数据对象中。
2. 从带分隔符的文本文件导入数据
可以使用read.table(file,header=logical_value,sep="delimiter",row.names="name")
grades <- read.table("studentgrades.csv", header=TRUE, sep=",", row.names="STUDENTID")
3. 导入Excel数据
读取Excel文件的最好的方式,就是在Excel中将其导出作为一个逗号分隔符文件,并使用前文描述的方式将其导入R中。
在Windows系统中,你也可以使用RODBC包来访问Excel文件,电子表格的第一行应当包含变量/列的名称。
Excel2007使用了一种xlsx的文件格式,实质上是多个XML文件组成的压缩包。可以使用xlsx包来读取。
4. 访问数据库管理系统
ODBC接口
在R中通过RODBC包访问一个数据库也许是最流行的方式,这种方式允许R连接到任意一种拥有ODBC驱动的数据库,其实几乎就是市面上所有的数据库。这个包允许R和数据库之间进行双向通信。
library(RODBC) myconn <- odbcConnect("mydsn",uid="Rob",pwd="123") crimedat <- sqlFeth(myconn, Crime) pundat <- sqlQuery(myconn, "select * from Punishment") close(myconn)
2.4 处理数据对象的实用函数
在本章节的末尾,我们来见到总结一下实用的数据对象处理函数。
以上是关于第2章--创建数据集的主要内容,如果未能解决你的问题,请参考以下文章