一、数据的基本类型和保存形式
(一)数据的基本形式
1、数字(double/numeric,缩写num)
---这里主要指的是实数,且在R语言中,在不加任何条件的情况下会默认精确到2位小数
2、整数(integer,缩写int):1L、2L……
---在R中输入的形式是在整数后面加一个L,如果不加的话,则会被认为是num的形式
3、虚数(complex,缩写cplx):1+2i,3-5i……
4、逻辑(logic,缩写logi):True、False
---输入的时候可以写True或者False,或者只写首字母T或F
5、文字(character,缩写chr)
(二)数据的保存形式
按照数据的维度(dimensionality)和一致性(homogeneity),R当中常见的数据形式分为如下几类
维度 | 一致的 | 异质的 |
1d | 向量(vector) | 列表(list) |
2d | 矩阵(matrix) | 数据框(data frame) |
Nd | 阵列(array) |
一致性:与数据的基本类型相关,一致性的数据形式要求其中每个数据都保存成同一类型,譬如全部保存成数字或文字。
异质性:没有要求
1、一维数据
(1)向量(vector)
当数据类型一致时
R当中最小单位的数据是向量
它由一个、多个或一串同样类型的数据组成
创建向量时用得是c语句(如下),即combine的缩写,它的功能是将括号里的数据合并保存在左边的向量中(Combine Values into a Vector or List)
#创建数字向量
var1 <- c (1,2.5,4.5)
var1
#创建文字向量
var2 <- c ("Hello","World")
var2
#创建逻辑向量
var3 <- c(TRUE,FALSE,T,F)
var3
> #创建数字向量 > var1 <- c (1,2.5,4.5) > var1 [1] 1.0 2.5 4.5> #创建文字向量 > var2 <- c ("Hello","World") > var2 [1] "Hello" "World" > #创建逻辑向量 > var3 <- c(TRUE,FALSE,T,F) > var3 [1] TRUE FALSE TRUE FALSE
在R当中,我们用左箭头(<-)来表示赋值的过程
我们描述向量的大小的时候,会用向量的长度来表示,也就是里面包含了几个数据。举个例子,上面创造的文字向量,共包含“Hello”和“World”两个数据,那么该向量的长度是2。
当数据类型不一致时,R会自动把向量保存成为较为灵活的形式
#同时在向量中保存实数和整数时,都会被保存成实数
var4 <- c(1.5,1L)
var4
#同时在向量中保存实数和文字时,都会被保存成文字
var5 <- c(2,"a")
var5
> #同时在向量中保存实数和整数时,都会被保存成实数 > var4 <- c(1.5,1L) > var4 [1] 1.5 1.0 > > #同时在向量中保存实数和文字时,都会被保存成文字 > var5 <- c(2,"a") > var5 [1] "2" "a"
(2)列表(list)
一个列表当中的数据类型可以不一致
x <- list(1:3,"a",c(TRUE,FALSE,TRUE),list(2.3,5.9))
x
> x <- list(1:3,"a",c(TRUE,FALSE,TRUE),list(2.3,5.9)) > x [[1]] [1] 1 2 3 [[2]] [1] "a" [[3]] [1] TRUE FALSE TRUE [[4]] [[4]][[1]] [1] 2.3 [[4]][[2]] [1] 5.9
这是一个列表的例子,这个列表李有四个元素,第一个是包含三个整数数据集的向量,第二个是包含一个文字“a”的向量,第三个是包含三个逻辑数据的向量,第四个则是另一个列表。
一个列表可以是层叠式,很复杂的结构,那么我们为什么还说列表是一个维度呢?因为在列表这个数据形式下面,我们只能一层一层地打开它的结构,获取其中的数据。这个操作相比于我们直接从一个表格中或数据框中获取数据,还是有很大的不同的。
如何快速查看数据结构?
#快速查看数据结构,str(),structure的缩写
str(x)
> #快速查看数据结构,str(),structure的缩写 > str(x) List of 4 $ : int [1:3] 1 2 3 $ : chr "a" $ : logi [1:3] TRUE FALSE TRUE $ :List of 2 ..$ : num 2.3 ..$ : num 5.9
这个功能对数据量很大,结构很复杂的列表非常有用!我们不用在concole里打开列表,就可以掌握里面的内容
2、二维数据
(1)矩阵(matrix) —— 数据类型一致
当构建矩阵时,我们需要告诉R,这个矩阵的长和宽分别是多少
#创建一个长为2行,宽为3列的矩阵
var6 <- matrix(1:6,ncol=3,nrow=2)
var6
> #创建一个长为2行,宽为3列的矩阵 > var6 <- matrix(1:6,ncol=3,nrow=2) > var6 [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6
另一种角度,矩阵可以看成是向量的构成。即给向量添加一个矩阵的框架
#先创建向量,再添加矩阵的框架
var7 <- 1:6
dim(var7) <- c(3,2)
var7
> #先创建向量,再添加矩阵的框架 > var7 <- 1:6 > dim(var7) <- c(3,2) > var7 [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6
首先创建一个向量var7,包含1到6六个数字,再给他添加一个三行两列的矩阵框架,就形成了一个矩阵,我们把矩阵的框架称为Dimensions,即dim(行数,列数)。
(2)数据框(data frame)—— 数据类型不一致
数据框是平时最常见的数据类型
#构建一个数据框,包含三个变量,每个变量的数据的数据类型可以不一致
var8 <- data.frame(x=1:3,y=c("a","b","c"),z=0)
str(var8)
> #构建一个数据框,包含三个变量,每个变量的数据的数据类型可以不一致 > var8 <- data.frame(x=1:3,y=c("a","b","c"),z=0) > str(var8) 'data.frame': 3 obs. of 3 variables: $ x: int 1 2 3 $ y: chr "a" "b" "c" $ z: num 0 0 0
我们可以在Environment窗口中也可以浏览该数据结构
和矩阵不同的是,在创建数据框的时候,不需要告诉R数据框的长和宽具体是多少,程序运行的时候,会直接根据每个变量的长度来决定。但是如果变量的长度不一,R可能会报错停止。
3、数据形式的互换
向量(vector) ↔ 矩阵(matrix) ↔ 数据框
矩阵 → 【as.data.frame】 → 数据框
数据框 → 【as.matrix】 → 矩阵
矩阵 → 【as.vector】 → 向量
思考:数据框不要求其中的数据类型一致,但是矩阵要求,那么把一个异质的数据框转换成矩阵时,会发生什么呢?把这个矩阵再次转换成数据框,又会发生什么呢?
因为文字的格式在R语言中是最灵活,将数据框转换为矩阵时,如果变量的数据类型不一致,包括了数字、文字的话,R会将所有数据都变成文字形式。
#构建一个数据框,包含三个变量,每个变量的数据的数据类型可以不一致
var8 <- data.frame(x=1:3,y=c("a","b","c"),z=0)
str(var8)
var9 <- as.matrix(var8)
str(var9)
var10 <- as.data.frame(var9)
str(var10)
> #构建一个数据框 > var8 <- data.frame(x=1:3,y=c("a","b","c"),z=0) > str(var8) 'data.frame': 3 obs. of 3 variables: $ x: int 1 2 3 $ y: chr "a" "b" "c" $ z: num 0 0 0 > #将该数据框转变成矩阵 > var9 <- as.matrix(var8) > str(var9) chr [1:3, 1:3] "1" "2" "3" "a" "b" "c" "0" "0" "0" - attr(*, "dimnames")=List of 2 ..$ : NULL ..$ : chr [1:3] "x" "y" "z" > #再将矩阵转变成数据框 > var10 <- as.data.frame(var9) > str(var10) 'data.frame': 3 obs. of 3 variables: $ x: chr "1" "2" "3" $ y: chr "a" "b" "c" $ z: chr "0" "0" "0"
4、分类变量(Factor)
R的数据框中常常将文字保存成分类变量
包含两个部分:数字(value)和 文字(level)
(类似于SPSS中的:1= male ,2 =female)
#构建向量
sex <- c("m","f","m","f","m","m")
str(sex)
#将向量转化为分类变量
sex_factor <- factor(sex,levels = c("m","f"))
str(sex_factor)
> #构建向量 > sex <- c("m","f","m","f","m","m") > str(sex) chr [1:6] "m" "f" "m" "f" "m" "m" > #将向量转化为分类变量 > sex_factor <- factor(sex,levels = c("m","f")) > str(sex_factor) Factor w/ 2 levels "m","f": 1 2 1 2 1 1
二、基本运算与数据提取
(一)基本运算
1、加减:+、-
2、乘除:*、/
3、平方、立方:^2,^3
4、求根():sqrt()
5、指数():exp()
6、对数():log()
1、对数字进行计算
#基本运算
1+1
2*3
6/3
3^2
sqrt(9)
exp(2)
log(7.390)
> #基本运算 > 1+1 [1] 2 > 2*3 [1] 6 > 6/3 [1] 2 > 3^2 [1] 9 > sqrt(9) [1] 3 > exp(2) [1] 7.389056 > log(7.390) [1] 2.000128
2、对向量进行计算
#对向量进行计算
var11 <- c(1,2,3)
var11
var11+1
var11+var11
var11*3
exp(var11)
> #对向量进行计算 > var11 <- c(1,2,3) > var11 [1] 1 2 3 > var11+1 [1] 2 3 4 > var11+var11 [1] 2 4 6 > var11*3 [1] 3 6 9 > exp(var11) [1] 2.718282 7.389056 20.085537
对向量中每一个数字进行相加,如果是向量和向量相加,则对应位置相加
3、对矩阵进行计算
#对矩阵进行计算
var12 <- matrix(data=c(1,4,4,9,16,25),ncol=3,nrow = 2)
var12
var12+5
#开根号则是对每一个位置上的数字进行开根号
sqrt(var12)
#用t()对矩阵进行转置,即Transpose
t(var12)
#矩阵的乘法需要(矩阵的内积)
var12 %*% t(var12)
> #对矩阵进行计算 > var12 <- matrix(data=c(1,4,4,9,16,25),ncol=3,nrow = 2) > var12 [,1] [,2] [,3] [1,] 1 4 16 [2,] 4 9 25 > var12+5 [,1] [,2] [,3] [1,] 6 9 21 [2,] 9 14 30 > #开根号则是对每一个位置上的数字进行开根号 > sqrt(var12) [,1] [,2] [,3] [1,] 1 2 4 [2,] 2 3 5 > #用t()对矩阵进行转置,即Transpose > t(var12) [,1] [,2] [1,] 1 4 [2,] 4 9 [3,] 16 25 > #矩阵的乘法需要(矩阵的内积) > var12 %*% t(var12) [,1] [,2] [1,] 273 440 [2,] 440 722
(二)数据提取
1、从向量中提取数据
#从向量中提取数据,可以使用向量名[数据的位置]
var13 <- c("a","b","c")
var13[1]
var13[2]
var13[3]
#当需要从向量中提取多个不连续的数据时,数据的位置可用向量表示,因为向量是一维的,[]中输入的数据的位置也应该是一维的
var13[c(1,3)]
> #从向量中提取数据,可以使用向量名[数据的位置] > var13 <- c("a","b","c") > var13[1] [1] "a" > var13[2] [1] "b" > var13[3] [1] "c" > #当需要从向量中提取多个不连续的数据时,数据的位置可用向量表示,因为向量是一维的,[]中输入的数据的位置也应该是一维的。不能写成var13[1,3]. > var13[c(1,3)] [1] "a" "c"
2、从矩阵中提取数据
#从矩阵中提取数据,可以使用矩阵名[所在行数,所在列数],矩阵是二维数据,故数据的位置应该有行数和列数两个参数
var14 <- matrix(data = c("a","b","c","d"),ncol = 2)
var14
var14[1,1]
var14[2,2]
#只提取某一行
var14[1,]
#只提取某一列
var14[,2]
> #从矩阵中提取数据,可以使用矩阵名[所在行数,所在列数],矩阵是二维数据,故数据的位置应该有行数和列数两个参数 > var14 <- matrix(data = c("a","b","c","d"),ncol = 2) > var14 [,1] [,2] [1,] "a" "c" [2,] "b" "d" > var14[1,1] [1] "a" > var14[2,2] [1] "d" > #只提取某一行 > var14[1,] [1] "a" "c" > #只提取某一列 > var14[,2] [1] "c" "d"
3、从数据框中提取数据
与矩阵类似,但数据框的每一个变量都是有名字的
#从数据框中提取数据
var15 <- data.frame(x=1:3,y=c("a","b","c"),z=0)
var15
#方法一:数据框名[所在行数,所在列数]
var15[1,1]
var15[1,]
var15[,3]
#方法二:数据框名[所在行数,所在列的名字]
var15[1,"x"]
var15[,"y"]
#使用$符号进行提取
var15$y
> #从数据框中提取数据 > var15 <- data.frame(x=1:3,y=c("a","b","c"),z=0) > var15 x y z 1 1 a 0 2 2 b 0 3 3 c 0 > #方法一:数据框名[所在行数,所在列数] > var15[1,1] [1] 1 > var15[1,] x y z 1 1 a 0 > var15[,3] [1] 0 0 0 > #方法二:数据框名[所在行数,所在列的名字] > var15[1,"x"] [1] 1 > var15[,"y"] [1] "a" "b" "c" > #使用$符号进行提取 > var15$y [1] "a" "b" "c"
#以上内容均为医咖会R语言基础课程的个人笔记整理,仅供参考学习