R语言入门系列文章目录
【R语言介绍】R与RStudio的安装、获取帮助、工作空间、输入和输出【创建数据集】变量、向量、矩阵、数组、数据框、因子、列表创建【R语言入门】创建数据集(二)【R语言入门】图形初阶【R语言入门】基本图形【R语言入门】基本统计分析
目录
- R语言入门系列文章目录
- 前言
- 一.数据集的概念
- 二.数据结构
- 1.变量
- 2.向量
- 3.矩阵
- 4.数组
- 5.数据框
- 6.因子
- 7.列表
- 总结
- 写在最后
前言
本章内容
探索R的数据结构
输入数据
导入数据
标注数据
一.数据集的概念
数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。
R中有许多用于存储数据的结构,包括标量、向量、数据、数据框和列表。
R可以处理的数据类型包括数值型、字符型、逻辑型(TRUE、FALSE)、复数型(虚数)和原生型(字节)。
二.数据结构
R拥有许多存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表。
在R中,对象是指可以赋值给变量的任何事物,包括常量、数据结构、函数、甚至图形。
数据框是R中用于存储数据的一种结构:列表示变量,行表示观测。
注意:R语言中的下标从1开始!!!
1.变量
变量是存储数据的载体。可以通过<-
和=
进行赋值,更常用的则是<-
。
变量可以有多种类型:
- 数值(Numeric):如10,3,14,0.25等。
- 字符(Character):如"a","results"等。
- 因子(factors):定性变量和有序变量。
- 逻辑符(Bool):有"TRUE"和"FLASE"。
- 日期(Date)
> x <- 10
> x
[1] 10
> y <- "a"
> y
[1] "a"
> class(x)
[1] "numeric"
> class(y)
[1] "character"
2.向量
向量是用于存储数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()
可用来创建向量。
注意:单个向量中的数据必须拥有相同的类型或模式(数值型、字符型或逻辑型),同一向量中无法混杂不同模式的数据。
> a <- c(1, 2, 5, 3, 6, -2, 4)
> a
[1] 1 2 5 3 6 -2 4
> b <- c("one", "two", "three")
> b
[1] "one" "two" "three"
> c <- c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE)
> c
[1] TRUE TRUE TRUE FALSE FALSE TRUE
标量是只含一个元素的向量,例如
f <-3
、g<-"US"
。用于保存向量。
通过在方括号中给定元素所处位置的数值,我们可以访问向量中的元素。
> a <- c("k", "j", "h", "a", "c", "m")
> a[3]
[1] "h"
> a[c(1, 3, 5)]
[1] "k" "h" "c"
> a[2:6]
[1] "j" "h" "a" "c" "m"
3.矩阵
矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型),简单说是多个向量的集合。可通过函数matrix()
创建矩阵。
myymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_columns,
byrow=logical_value, dimnames=list(
char_vector_rownames, char_vector_colnames))
vector包含了矩阵的元素。 nrow和ncol用以指定行和列的维数。
dimnames包含了可选的、以字符型向量表示的行名和列名。
byrow则表明矩阵应该按行填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认情况下按列填充。
> 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
> cells <- c(1,26,24,68)
> rnames <- c("R1","R2")
> cnames <- c("C1","C2")
> mat <- matrix(cells, nrow=2, ncol=2, byrow = TRUE, dimnames = list(rnames, cnames))
> mat
C1 C2
R1 1 26
R2 24 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
4.数组
数组与矩阵类似,但是维度可以大于2。数组可以通过array()
创建。
myarray <- array(vector, dimensions, dimnames)
vector包含了数组中的数据。
dimensions是一个数值型向量,给出了各个维度下标的最大值。
dimnames是可选的、各维度名称标签的列表。
> 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
> z[1, 2, 3]
[1] 15
5.数据框
由于不同的列可以包含不同模式(数值型、字符型等)的数据,数据框的概念较矩阵来说更为一般。通常在SPSS和Stata中看到的数据集类似。数据框将是你在R中最常处理的数据结构。
数据框可通过函数data.frame()
创建:
mydata <- data.frame(col1, co12, 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
实例标识符(类似索引,不能重复)
该数据中,patientID可用于区分数据集中不同的个体。
在R中实例标识符可通过数据框操作函数中的rowname选项指定。
将patientID指定为R中标记各类打印输出和图形中实例名称所用的变量。
# 实例标识符:patientID
> patientdata <- data.frame(patientID, age, diabetes, status, row.names=patientID)
> 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 <- data.frame(patientID, age, diabetes, status, row.names=age)
> # 实例标识符:age
> patientdata
patientID age diabetes status
25 1 25 Type1 Poor
34 2 34 Type2 Improved
28 3 28 Type1 Excellent
52 4 52 Type1 Poor
> # 实例标识符:diabetes
> patientdata <- data.frame(patientID, age, diabetes, status, row.names=diabetes)
Error in data.frame(patientID, age, diabetes, status, row.names = diabetes) :
row.names有重复: Type1
>
> 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
$
被用来选取一个给定数据框中的某个特定变量。例如生成diabetes
和status
的列联表,可以表示为:
> table(patientdata$diabetes, patientdata$status)
Excellent Improved Poor
Type1 1 0 2
Type2 0 1 0
此外,如果数据框中变量很多,总是使用$
会很麻烦,所以我们可以将数据框添加到R的搜索路径中。可以联合使用函数attach()
和detach()
或单独使用函数with()
来简化代码。
以R自带的mtcars数据框为例:
mpg:每加仑行驶英里数。
disp:发动机排量。
wt:车身重量。
> summary(mtcars$mpg) #获取描述性统计量
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.40 15.43 19.20 20.09 22.80 33.90
> plot(mtcars$mpg, mtcars$disp) # 绘制散点图
> plot(mtcars$mpg, mtcars$wt)
可更改为:
> attach(mtcars)
> summary(mpg)
> plot(mpg, disp)
> plot(mpg, wt)
> detach(mtcars)
- 函数
attach()
可将数据框添加到R的搜索路径中。 - 函数
detach()
可将数据框从R的搜索路径中移除。
局限性:当名称相同的变量不止一个时,原始对象将取得优先权。
> mpg <- c(25, 36, 47)
> attach(mtcars)
The following object is masked _by_ .GlobalEnv:
mpg # mtcars中的mpg对象被屏蔽
> plot(mpg, disp) # 此时mpg中有3个元素,disp中有32个元素,所以报错
Error in xy.coords(x, y, xlabel, ylabel, log) :
'x' and 'y' lengths differ
还可更改为:
# 花括号{}之间的语句都是针对数据框mtcars执行。
# 若花括号{}仅有一条语句,则可以省略花括号。
> with(mtcars, {
print(summary(mpg))
plot(mpg, disp)
plot(mpg, wt)
})
- 函数
with()
局限性:赋值仅在此函数括号内生效,若需要创建with()结构之外存在的对象,使用特殊赋值符<<-
替代标准赋值符<-
,可将对象保存到with()之外的全局环境中
> with(mtcars, {
+ stats <- summary(mpg)
+ newstats <<- summary(mpg)
+ })
> stats
错误: 找不到对象'stats'
> newstats
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.40 15.43 19.20 20.09 22.80 33.90
6.因子
变量可归结为名义型、有序型或连续型变量。
名义型变量:没有顺序之分的类别变量。如Diabetes(Type1, Type2)
有序型变量:表示一种顺序关系,非数量关系。如Status(poor、improves、excellent)
连续型变量:可以呈现为某个范围内的任意值,并同时表示了顺序和数量。如Age(25、34、28、52)
类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)。
函数
factor()
以一个整数向量的形式存储类别值,整数的取值范围是[1…k](其中k是名义型变量中唯一值的个数),同时由一个字符串(原始值)组成的内部向量将映射到这些整数上。
# 表示有序型变量,需要指定参数 ordered=TRUE
# 对于字符型向量,因子的水平默认依字母顺序创建,可以通过指定levels选项来覆盖默认排序。
# 数值型变量可以用levels和labels参数来编码成因子。如果男性被编码成1,女性被编码成2。标签顺序必须和水平相一致。否则为缺失值。
status <- factor(status, order=TRUE, levels=c("Poor", "Improved", "Excellent"))
sex <- factor(sex, levels=c(1,2), labels=("Male", "Female"))
> 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 : Factor w/ 3 levels "Excellent","Improved",..: 3 2 1 3
> summary(patientdata)
patientID age diabetes status
Min. :1.00 Min. :25.00 Type1:3 Excellent:1
1st Qu.:1.75 1st Qu.:27.25 Type2:1 Improved :1
Median :2.50 Median :31.00 Poor :2
Mean :2.50 Mean :34.75
3rd Qu.:3.25 3rd Qu.:38.50
Max. :4.00 Max. :52.00
7.列表
列表是R的数据类型中最为复杂的一种,列表就是一些对象的有序集合,可以是若干向量、矩阵、数据框,甚至其他列表的组合,可以使用函数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
> mylist[2]
$ages
[1] 25 26 18 39
总结
R语言中对象名称中美元符号($)等价于其他语言的句点(.)。
R不提供多行注释或块注释的功能,可以将解释器忽略的代码放在语句if(Flase){…}中。
R中没有标量,标量以单元素向量的形式出现。
R的下标从1开始,不是从0开始。
将一个值赋给某个向量、矩阵、数组或列表中一个不存在的元素,R将自动扩展这个数据结构容纳新值而不会报错。
> x <- c(8, 6, 4)
> x[7] <- 10
> x
[1] 8 6 4 NA NA NA 10
这章主要探索了R语言中变量、向量、矩阵、数组、数据框、因子、列表创建。在下一章中,我们将着眼于R如何从文本文件、其他程序和数据库关系系统中导入数据。感谢阅读,谢谢支持!