R_2.创建数据集

19 篇文章 0 订阅

2.1什么是数据集

  • 数据集通常是由数据构成的一个矩阵数组。行为观测列为变量(统计学术语,在机器学习学科称行为示例example列为属性attribute)
  • R中有很多用于存储数据的结构,包括标量,向量,数组,数据框和列表
  • R原生可以处理的数据类型包括数值型(numeric,integer)、字符型、布尔型(TRUE/FALSE)、复数型、原生型(字节)
    • numericinterger两种数据类型的区分:numeric为浮点数,integer为整数,integer占用内存少,所以在数据方便时,把numeric转成integer可以节省内存

#区别如下(使用as命令,as为显式强转)
> as.integer(1.23) #
1.23强转为integer

[1] 1
> as.numeric(1.23)#
1.23强转为numeric
[1] 1.23

  

  • 以一个表格为例:

ID(/实例标识符)

入学时间(日期型变量)

年龄(连续型变量)

院系(名义型变量)

性别(有序型变量)

1

数值型变量

10/9/2015

数值型变量(存疑,如果算上'/'的话得按字符型变量算)

18

数值型变量

信息

字符型变量

字符型变量

称为:行名

  

  

因子

因子

  

  

2.2向量

向量分为数值型,字符型和逻辑型,都可以用c()函数创建

a <- c(1,2,35,3,6,-2,4)

b <- c("one","two","three")

c <- c(TRUE,TRUE,TRUE,FALSE,TRUE)

同一向量中无法混杂不同模式的数据

a[c(2,4)]访问向量a中的第二个和第四个元素

a[2:6]访问第二个到第六个元素

同时,还有vector()函数,可以限定创建特定类型的向量

this_is_a_vector<-vector("numeric", length=10)

#默认numeric类型向量会生成长度为10元素全为0的向量

> this_is_a_vector
[1] 0 0 0 0 0 0 0 0 0 0

需要注意的是,如果一个向量混入了不同类型的变量,R并不会报错,而是会隐式强转成同一种数据类型

如果数值型与字符型混在一起就会变成字符型,布尔型与数值型混在一起则会转成数值型,字符型与布尔型混在一起会变成字符型

同时,R还提供显式强转函数as.xx例如as.numeric(a)会把a转换为numeric类型同理还可转换成字符,布尔。

但有时候强转会失灵(即出现NA错误)

> g<-c("a","b","c")
> as.numeric(g)
[1] NA NA NA #强转失灵,发生NA错误,因为没法将字符型转为数值型
Warning message:
NAs introduced by coercion
> as.logical(g)
[1] NA NA NA

2.3矩阵

同样,分为数值型,字符型和逻辑型通过函数matrix()创建矩阵

书写格式:

my_matrix <- matrix(vector, nrow=5,ncol=5,byrow=TRUE/FALSE, dimnames=list(一个行名,一个列名))

#其中"一个行名""一个列名"用字符型向量生成e.g.rnames<-("R1","R2")cnames<-("C1","C2") dimnames=list(rnames,cnames)#rnames即为"一个行名"cnames即为"一个列名"

创建了一个5*5的矩阵,元素在vector中到时候替换即可,byrow代表按行存储还是按列TRUE就代表按行存储,dimnames包含了可选的、以字符型向量表示的行名和列名。

例如

>test_matrix<-matrix(1:20,nrow=5,ncol=4)#创建5*4矩阵,因为没有设置byrow=TRUE所以矩阵默认按列生成

> test_matrix
[,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,24,68)
> rnames<-c("R1","R2")
> cnames<-c("C1","C2")
> new_matrix<-matrix(cells,nrow=2,ncol=2,byrow=TRUE,dimnames = list(rnames,cnames)) #
创建2*2的含列名标签的按行填充的矩阵
> new_matrix
C1 C2
R1 1 26
R2 24 68

> new_matrix<-matrix(cells,nrow=2,ncol=2,byrow=FALSE,dimnames = list(rnames,cnames)) #按列填充的2*2矩阵
> new_matrix
C1 C2
R1 1 24
R2 26 68

x[i,]指矩阵x中的第i行,x[,j]指矩阵x中的第j列,x[i,j]指第i行第j列的元素,选择多行或多列时可用数值型向量如x[i,c(m,n)]为第i行第m,n列的元素

与矩阵相关的函数dim() 返回维度属性,几行几列

> dim(test_matrix)
[1] 5 4

test_matrix54列的矩阵

attribues()#返回一个列表,第一个元素为dim元素即一个包含dim元素的向量

> attributes(test_matrix)
$dim
[1] 5 4

矩阵还可以通过对已有向量添加维度属性来创建

> existing_vextor<-1:10 #已存在向量
> existing_vextor
[1] 1 2 3 4 5 6 7 8 9 10
> dim(existing_vextor)<-c(2,5)#
exising_vecordim属性进行了赋值,相当于把向量转化为xx列的矩阵

> existing_vextor
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10

还可以通过绑定行或列来生成

cbind()#绑定列来生成矩阵

rbind()#绑定行来生成矩阵

> a<-1:4
> b<-5:8
> cbind(a,b)
a b
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
> rbind(a,b)
[,1] [,2] [,3] [,4]
a 1 2 3 4
b 5 6 7 8

2.4数组

维度大于2时就不建议使用矩阵了,建议使用数组。

使用array()函数创建,形式如下

this_is_a_array<-array(vector,dimensions,dimnames)

vector包含了数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大值,而dimnames是可选的、各个维度名称标签的列表。

#创建一个三维(2*3*4)数值型数组
> name1<-c("A1","A2")

> name2<-c("B1","B2","B3")
> name3<-c("C1","C2","C3","C4")
> this_is_a_array<-array(1:24,c(2,3,4),dimnames=list(name1,name2,name3))
> this_is_a_array
, , 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

#选取元素方式与矩阵相同,this_is_a_array[1,2,3]对应15

2.5数据框

从结构上来看,与矩阵是相似的。由于不同的列可包含多种数据类型,数据框较矩阵更加一般。在R中非常常用。之前的那个表由于包含了数值型和字符型数据等不同种数据,不能使用矩阵,这种情况下(存储表格数据),使用数据框是最佳选择。

使用data.frame()函数创建数据框

this_is_a_dataframe<-data.frame(col1,col2,col3,…)

列向量col1,col2,col3,…可为任意类型(如字符型,数值型或逻辑型)。但列向量类型必须唯一

> ID<-c(1,2)
> age<-c(18,19)
> sex<-c("male","female")
> department<-c("COI","COB")
> admit_time<-c('9/1/2015','8/31/2015')
> student_data<-data.frame(ID,age,sex,admit_time,department)
> student_data
ID age sex admit_time department
1 1 18 male 9/1/2015 COI
2 2 19 female 8/31/2015 COB

> nrow(student_data)#返回行数
[1] 2
> NCOL(
student_data)#返回列数
[1] 5

选取数据框中元素的方式有若干种,既可以使用前述下标记号student_data[2,3],也可以直接指定列名

> student_data[1,2]
[1] 18
> student_data[1:2]
ID age
1 1 18
2 2 19
> student_data[c("sex","department")]
sex department
1 male COI
2 female COB
> student_data$age #'$age'
表示student_data数据框中的变量age
[1] 18 19

如果想生成sexdepartment的列联表

> table(student_data$sex,student_data$department)

COB COI
female 1 0
male 0 1

  

可能会注意到,每次都要在变量名之前添上student_data$不免麻烦,其实可以借助attach()detach()函数或者单独使用with()函数来简化代码。

  • attach()函数可将数据框添加到R的搜索路径中,R在遇到一个变量名后,将检查搜索路径中的数据框,以定位到这个变量

attach(student_data)#当名称相同的的对象不止一个时会出现

The following objects are masked _by_ .GlobalEnv:#以下对象已被屏蔽

admit_time, age, department, ID, sex

的错误,原因是student_data被绑定前环境里已经有一个名为student_data的对象了。所以使用attach()函数最好在分析一个单独的数据框,且不太可能有重名对象的情况下。

summary(department)

plot(sex,department)

detach(student_data)

detach()是个好习惯,虽然放在这里是可以忽略的。但习惯要有,就像malloc()free()一样

  • with()函数->推荐

    在不确定的情况下,with()函数在一些方面优于attach()

> with(student_data,{
+ stats<-summary(sex)
+ stats
+ })
female male
1 1

如果只有一条语句(如只有summary(sex))那么{}可以省略

with()函数的局限性在于赋值尽在大括号内有效,括号外就消亡了,所以是局部变量局部赋值而非全局赋值

> with(student_data,{stats<-summary(sex)})
> stats
Error: object 'stats' not found

要想创建全局有效的变量与赋值,需要特殊赋值符"<<-"代替"<-",如此可将stats保存为with()以外的全局环境中

> with(student_data,{stats<<-summary(sex)})
> stats
female male
1 1

下面介绍实例标识符,用于区分数据集中不同的个体。可通过数据框操作函数row.names()指定。例如this_is_a_dataframe<-data.frame(col1,col2,col3row.names=col2)

col2指定为R中标记各类打印输出和图形中实例名称所用的变量

> plot(col2,this_is_a_dataframe$col3)

2.6因子

有开头的表格例子可以看出,在变量逻辑性质上可以将变量分为名义型、有序型或连续型变量。

  • 名义型变量是没有顺序之分的类别变量,如"院系"中可以将信息学院编号为1,工学院编为2但并不意味着二者有序。
  • 有序型变量则表示顺序关系,而非数量关系。如"年级"中的大一大二大三,大三已学的东西最多大二次之大一最少,然而并不知道学的到底差多少。
  • 连续型变量可以呈现某个范围内的任意值,并同时表示了顺序和数量。如"年龄"可以表示18岁到22岁之间的任意值包括18.8或者21.5这样的小数。不像有序性变量大一大二,在连续型变量中我们可以清楚知道19岁比18岁大一岁

于是引出因子的概念,R中的因子即为类别(名义型)变量和有序类别(有序型)变量。因子决定了数据的分析方式以及如何进行视觉呈现。

函数factor()以一整数向量的形式存储类别值,整数的取值范围是[1…k]其中k是名义型变量中唯一值的个数,同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。

例如

设向量college_department<-c("xinxi","gongxue","zhibao","xinxi")

college_department<-factor(college_department)将此向量存储为(1,2,3,1)

并在内部将关联设为1=xinxi2=gongxue3=植保

现在针对college_deparment的分析均会以名义型变量对待。

如要表示有序型变量,需要为函数factor()指定参数ordered=TRUE

grade<-c("freshman","sophomore","junior","senior","freshman")

grade<-factor(grade,ordered=TRUE)会将向量编码为(1,4,2,3,1),然而这并不是我们想要的顺序,原因是字符型向量因子按照字符串比较(先字母顺序再字符串长度)来分的顺序。我们可人为标号来保证顺序

grade<-c("4senior","3junior","2sophomore","1freshman","1freshman")

或者通过levels命令来覆盖默认顺序

grade<-factor(grade,ordered=TRUE,levels=c("freshman","sophomore","junior","senior"))

现在针对grade的分析均会以有序型变量对待。

给出示例

#以向量形式输入数据

> sex<-c("male","male","male","female","female")

> college_department<-c("xinxi","gongxue","dongke","zhibao","xinxi")
> college_department<-factor(college_department)

> grade<-c("freshman","sophomore","junior","senior","freshman")
> grade<-factor(grade,ordered=TRUE,levels=c("freshman","sophomore","junior","senior"))
> ID<-c(1,2,3,4,5)
> age<-c(18,19,20,21,17)
> student_data<-data.frame(ID,sex,age,college_department,grade)

#显示对象的结构

> str(student_data)
'data.frame':        5 obs. of 5 variables:
$ ID : num 1 2 3 4 5
$ sex : Factor w/ 2 levels "female","male": 2 2 2 1 1
$ age : num 18 19 20 21 17
$ college_department: Factor w/ 4 levels "dongke","gongxue",..: 3 2 1 4 3

$ grade : Ord.factor w/ 4 levels "freshman"<"sophomore"<..: 1 2 3 4 1

#显示对象的统计概要

> summary(student_data)
ID sex age college_department grade
Min. :1 female:2 Min. :17 dongke :1 freshman :2
1st Qu.:2 male :3 1st Qu.:18 gongxue:1 sophomore:1
Median :3 Median :19 xinxi :2 junior :1
Mean :3 Mean :19 zhibao :1 senior :1
3rd Qu.:4 3rd Qu.:20
Max. :5 Max. :21

#显示关系图表
> student_data
ID sex age college_department grade
1 1 male 18 xinxi freshman
2 2 male 19 gongxue sophomore
3 3 male 20 dongke junior
4 4 female 21 zhibao senior

5 5 female 17 xinxi freshman

提示:

  • str()函数提供R某个具体对象(示例中的student_data)的信息,示例中str函数就很清楚得显示出college_department是因子,grade是有序型因子,以及他们的编码顺序
  • summary()区别对待各个变量,它显示了连续型变量age的最大值最小值均值以及各四分位数,对于类别型变量college_departmentgrade则显示了各水平的频数值。

再举一个例子

> a<-c("yes","yes","ok","no","no","maybe")
> x<-factor(a)
> x

[1] yes yes ok no no maybe
Levels: maybe no ok yes
> table(x)#
返回每个level出现的频率

x
maybe no ok yes
1 2 1 2

> unclass(x)#移除一个向量的类型,此语句会将x变为一个整型向量,这个函数帮助你了解因子在R中是如何被编码的

[1] 4 4 3 2 2 1
attr(,"levels") #
包含了名为levels的属性,level分为yes,no,maybe,ok
[1] "maybe" "no" "ok" "yes"

> xx<-factor(a,ordered=TRUE,levels=c("no","maybe","ok","yes"))

> xx
[1] yes yes ok no no maybe
Levels: no < maybe < ok < yes

> unclass(xx)
[1] 4 4 3 1 1 2
attr(,"levels")
[1] "no" "maybe" "ok" "yes"

> xx<-factor(a,levels=c("no","maybe","ok","yes"))

xx
[1] yes yes ok no no maybe
Levels: no maybe ok yes

> unclass(xx)#如果不加ordered=TRUE内部编码不会变
[1] 4 4 3 1 1 2
attr(,"levels")
[1] "no" "maybe" "ok" "yes"

2.7列表

非常重要的数据类型,形似向量,然而兼容性更好,可以包括若干不同类型的元素

> h<-c(18,18,18,19,17)
> a_list<-list(1,2.5,"a",age=h,TRUE,4+26i)
> a_list[[2]]
[1] 2.5
> a_list[[4]]
[1] 18 18 18 19 17
> a_list[["age"]]
[1] 18 18 18 19 17
> a_list
[[1]]
[1] 1

[[2]]
[1] 2.5

[[3]]
[1] "a"

$age
[1] 18 18 18 19 17

[[5]]
[1] TRUE

[[6]]
[1] 4+26i

双重方括号可以用来查找列表元素,而查找时不光可以使用元素顺序值,还可以使用名称(如果设定了的话,如age)

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值