在R语言中,有多种数据类型,用以存储和处理数据。每种数据类型都有其特定的用途和操作函数,使得R语言在处理各种数据分析任务时非常灵活和强大:
向量(Vector): 向量是R语言中最基本的数据类型,它是由相同类型的元素构成的一维数组。例如,一个由数值组成的向量或一个由字符串组成的向量。
矩阵(Matrix): 矩阵是一个二维数组,其中的数据元素按照行和列的形式排列。矩阵中的所有元素必须是同一类型。
数组(Array): 数组是向量的一种扩展,可以有多维。例如,你可以有一个三维数组,其中包含多个二维矩阵。
数据框(Data Frame): 数据框是R语言中用于存储表格数据的最重要的数据类型。它类似于数据库中的表或Excel中的电子表格。数据框可以包含不同类型的列(数值、字符、逻辑等)。
列表(List): 列表是一种复合数据类型,可以包含任意类型的元素(数值、字符、向量、矩阵、甚至其他列表等),并且各元素的长度也可以不同。
因子(Factor): 因子是用于分类数据的数据类型。它们用于表示有限的分类值集,例如性别(男、女)、评级(优、良、差)等。
逻辑值(Logical): 逻辑值是R语言中的布尔类型,代表真(TRUE)或假(FALSE)。
2.1 理解数据集
行(row):表示观测值 列(col):表示变量
2.2 数据结构
包括标量、向量、矩阵、数组、数据框、列表。
2.2.1 向量(vector)
2.2.1.1 定义
是用于存储数值型、字符型或逻辑型数据的一维数组。例如:
a <- c(1,2,3,4,5,6,-2,4)
b <- c("one","two","three","four")
c <- c(TRUE,TRUE,TRUE,FALSE,FALSE)
a为数值型向量,b字符型(必须加”“),c逻辑型向量。
单个向量中的数据类型必须相同
标量(scalar)是只含一个元素的向量。eg g<-1
2.2.1.2 访问向量中的元素
注:R中位置索引从1开始,而不是0
1)访问单个元素
a <- c("k","q","e","f","a","w","p","m")
a[3]
## [1] "e"
2)访问多个元素
a <- c("k","q","e","f","a","w","p","m")
a[c(1,2,4,6)]
## [1] "k" "q" "f" "w"
3)连续访问多个元素
a <- c("k","q","e","f","a","w","p","m")
a[c(2:6)]
## [1] "q" "e" "f" "a" "w"
2.2.2 矩阵(matrix)
2.2.2.1 定义
是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。
可以通过函数matrix()创建矩阵,格式如下:
mymatrix <- 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 = TRUE:矩阵按行填充,byrow = FALSE:矩阵按列填充。**如果不做设定,默认情况下按列填充。
因此,创建矩阵时至少包括vector,nrow,ncol
2.2.2.2 创建矩阵
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")
mymatrix1 <- matrix(cells,nrow = 2,ncol = 2,byrow = FALSE,dimnames = list(rnames,cnames))
mymatrix1
## C1 C2
## R1 1 24
## R2 26 68
可以看到优先按列填充,且行名为rnames,列名为cnames。
下面改变一些参数:
cells <- c(1,26,24,68)
rnames <- c("R1","R2")
cnames <- c("C1","C2")
mymatrix2 <- matrix(cells,nrow = 2,ncol = 2,byrow = TRUE,dimnames = list(cnames,rnames))
mymatrix2
## R1 R2
## C1 1 26
## C2 24 68
可以看的变成了优先按行填充,行名变为cnames,列名变为rnames。
2.2.3 访问矩阵中的元素
使用下标和方括号来选择矩阵中的行、列或元素。
x[i,]:矩阵x中的第i行
x[,j]:矩阵x中的第j列
x[i,j]:矩阵x中第i行第j列个元素
x[i,c(h,j)]:矩阵x中第i行,第h和j列
x[c(h:i),j]:矩阵x中第h-i行,第j列
举例
x <- matrix(21:40,nrow = 4,ncol = 5 )
x
## [,1] [,2] [,3] [,4] [,5]
## [1,] 21 25 29 33 37
## [2,] 22 26 30 34 38
## [3,] 23 27 31 35 39
## [4,] 24 28 32 36 40
x[1,]
## [1] 21 25 29 33 37
x[,5]
## [1] 37 38 39 40
x[c(1,2,3),5]
## [1] 37 38 39
x[c(2:4),c(2:4)]
## [,1] [,2] [,3]
## [1,] 26 30 34
## [2,] 27 31 35
## [3,] 28 32 36
矩阵也只能包含一种数据类型,当维度超过2时,可以使用数组
2.2.3 数组(array)
2.2.3.1 定义
数组(array)与矩阵类似,但是维度可以大于2,即可以是三维的。
通过函数array()创建:
myarray <- array(vector,dimensions,dimnames)
vector:数组中的数据
dimensions:数值型向量,给出了各个维度下标的最大值,按行,列,面进行排序
dimnames:可选的、各维度名称标签的列表
2.2.3.2 创建数组
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
可以看到这里c(2,3,4)表示的3个维度分别为2,3,4个,即2行3列4面。
2.2.3.3 访问数组中的元素
和矩阵类似,使用下标和方括号来选择。
z[1,3,4]
## [1] 23
这表示选择是维度1中的1(第一行),维度2中的3(第三列),维度3中的4(第4个矩阵) 可以某种程度上将数组看出几个矩阵的组合。
2.2.4 数据框(data)
2.2.4.1 定义
数据框的不同列可以包含不同模式(数值型、字符型、逻辑型)数据,更类似于常见的数据集。
通过函数data.frame()创建:
mydata <- data.frame(col1,col2,col3,...)
col1,col2,col3,…:列向量,可以为任何类型的数据,每一列的名称由函数names指定。 但通常不同列(变量)的向量中的数据(观测值)个数相同,且每一列数据的模式必须相同
2.2.4.2 创建数据框
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
2.2.4.3 选取数据框中的元素
1)用方括号和下标来选取,[n]和[n1:n2]格式下标的数字表示第n1到n2变量(列)
patientdata[1:2]
## patientID age
## 1 1 25
## 2 2 34
## 3 3 28
## 4 4 52
patientdata[4]
## status
## 1 Poor
## 2 Improved
## 3 Excellent
## 4 Poor
而[n1,n2]则选取的依然是第n1行,n2列对应的元素
patientdata[3,4]
## [1] "Excellent"
2)直接利用函数制定特定变量名来获取
patientdata[c("age","status")]
## age status
## 1 25 Poor
## 2 34 Improved
## 3 28 Excellent
## 4 52 Poor
注意变量名是字符型数据,所以要加”“
3)利用$符号+变量名(不用双引号)
patientdata$status
## [1] "Poor" "Improved" "Excellent" "Poor"
with()函数
在每个变量名前都输入一次patientdata$比较繁琐,可以借助with()函数简化代码
以内置数据框mtcars为例:
mtcars
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
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)
summary()获取描述性统计量,可以提供最小值、最大值、四分位数和数值型变量的均值,以及因子向量和逻辑型向量的频数统计等。结果输出中的1Q和Q3分别为残差第一四分位数(1Q)和第三分位数(Q3)。
利用with()函数可以简化为:
with(mtcars,{summary(mpg)
plot(mpg,disp)
plot(mpg,wt)})
{}中的命令都是针对mtcars执行,如果仅有一条命令,那么{}可省略。
函数with()的局限性在于赋值仅在此函数的括号里生效,例如:
with(mtcars,{stats <- summary(mpg)
stats})
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 10.40 15.43 19.20 20.09 22.80 33.90
stats
## Error in eval(expr, envir, enclos): 找不到对象'stats'
如果需要创建with()以外存在的对象,可使用特殊赋值符号 <<-替代原来的<- ,即可将对象保存到with()之外的全局环境中,例如:
with(mtcars,{stats <<- summary(mpg)
stats})
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 10.40 15.43 19.20 20.09 22.80 33.90
stats
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 10.40 15.43 19.20 20.09 22.80 33.90
2.2.5 因子(factor)
2.2.5.1 定义
谈因子前首先要对变量进行分类,可以分为:
变量分类 | 定义 | 包括 | 具体举例 |
---|---|---|---|
名义变量(分类变量) nominal variable |
没有顺序之分的分类变量 | 性别,省份,职业、分型等 | Diabetes(Type1、Type2) |
顺序变量 ordinal variable |
一种顺序关系而非数量关系 | 班级,名次,病情等 | Status(poor、improved、excellent) |
连续变量 continuous variable |
可呈现为某个范围内的任意值,并同时表示了顺序和数量 | 连续的数值,可以进行求和,平均值等运算 | age(15、21、33) |
其中名义变量和顺序变量称为因子
2.2.5.1.1 名义变量作为因子时
函数factor()以一个整数向量的形式存储类别值,整数的取值范围是1…k。同时,一个由字符串(原始值)组成的内部向量将映射到这些整数上。
举例:
diabetes <- c("Type1","Type2","Type1","Type1")
diabetes1 <- factor(diabetes)
str(diabetes)
## chr [1:4] "Type1" "Type2" "Type1" "Type1"
str(diabetes1)
## Factor w/ 2 levels "Type1","Type2": 1 2 1 1
可以看到用factor()将向量存储为(1,2,1,1),并在内部将其关联为1=Type1,2=Type2.
2.2.5.1.2 顺序变量作为因子时
表示顺序变量时,要指定ordered=TRUE
status<- c("poor","improved","excellent","poor")
status1 <- factor(status,ordered = TRUE)
str(status)
## chr [1:4] "poor" "improved" "excellent" "poor"
str(status1)
## Ord.factor w/ 3 levels "excellent"<"improved"<..: 3 2 1 3
对于字符型向量,因子的水平(level)默认依字母顺序创建,但很少情况是理想的,可以用levels选项覆盖默认排序,重新排序:
status<- c("poor","improved","excellent","poor")
status2 <- factor(status,ordered = TRUE,levels = c("poor","improved","excellent"))
str(status)
## chr [1:4] "poor" "improved" "excellent" "poor"
str(status2)
## Ord.factor w/ 3 levels "poor"<"improved"<..: 1 2 3 1
这样排序从原来的3213变成了1231。
数值型变量可以用参数levels和labels来编码因子 例如,男性被编码为1,女性被编码为2:
sex <- c(1,2,2,1)
sex<- factor(sex,levels = c(1,2),labels = c("Male","Female"))
sex
## [1] Male Female Female Male
## Levels: Male Female
归根结底,因子和非因子到底什么区别?我们用一张图就可以直观感受 plot函数的数据集是向量的作图输出散点图:
mtcars$cyl
## [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
plot(mtcars$cyl)
plot函数的数据集是因子的作图输出条形图:
mtcars$cyl
## [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
mtcars1 <- factor(mtcars$cyl)
plot(mtcars1)
2.2.6 列表(list)
2.2.6.1 定义
一些对象(或成分)的有序集合。一个列表中可能包含若干对象(可能无关的)如向量,矩阵,数据框甚至其他列表。
用函数list()创建,也可以对列表中的对象命名:
mylist <- list(object1,object2,...)
mylist <- list(name1=object1,name2=object2,...)
2.2.6.2 创建一个列表
g <- "My Frist list"
h <- c(25,23,11,13)
j <- matrix(1:10,nrow = 5)
k <- c("one","two","three")
mylist <- list(title=g,ages=h,j,k)
mylist
## $title
## [1] "My Frist list"
##
## $ages
## [1] 25 23 11 13
##
## [[3]]
## [,1] [,2]
## [1,] 1 6
## [2,] 2 7
## [3,] 3 8
## [4,] 4 9
## [5,] 5 10
##
## [[4]]
## [1] "one" "two" "three"
这个列表中包含了字符型、数值型向量,矩阵。
2.2.6.3 选取列表中的元素
一般用[[]],双重方括号加数字或名称来访问
mylist[[2]]
## [1] 25 23 11 13
mylist[["title"]]
## [1] "My Frist list"
mylist["title"]
## $title
## [1] "My Frist list"
2.2.7 tibble数据框
2.2.7.1 定义
与标准数据框相比,tibble数据框的打印格式更加紧凑。且变量标签描述了每一列的数据类型。
安装tibble包:
install.packages("tibble")
用函数tibble()或as_tibble()创建
举例来看:
mtcars
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
library(tibble)
mtcars2 <- tibble(mtcars)
mtcars2
## # A tibble: 32 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
## 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
## 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
## 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
## 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
## 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
## 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
## # ℹ 22 more rows
这里变量名下的<>中的内容代表变量类型:
缩写 | 变量类型 |
---|---|
int | 整数型变量 |
dbl | 双精度浮点数型变量,或称实数 |
chr | 字符向量,或称字符串 |
dttm | 日期时间(日期+ 时间)型变量 |
date | 日期型变量 |
lgl | 逻辑型变量,是一个仅包括TRUE 和FALSE 的向量 |
fctr | 因子,R 用其来表示具有固定数目的值的分类变量 |
可以看到tibble数据框有几个特点:
1)不支持行名,可以用rownames_to_column()将数据框的行名转变为变量。
library(tibble)
mtcars2 <- tibble(mtcars)
mtcars2
## # A tibble: 32 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
## 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
## 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
## 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
## 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
## 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
## 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
## # ℹ 22 more rows
rownames_to_column(mtcars2)
## # A tibble: 32 × 12
## rowname mpg cyl disp hp drat wt qsec vs am gear carb
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
## 5 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
## 6 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
## 7 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
## 8 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
## 9 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
## 10 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
## # ℹ 22 more rows
2)不会更改变量的名称。例如导入的数据集中有一变量名为last dance,在R中变量名中不得有空格,因此普通数据集函数会将其改为last.dance,而tibble数据框会保留这样的命名,并用反引号(last dance
)使变量名在语法上正确。
3)tibble数据框取子集总是返回一个tibble数据框。
例如,普通的数据框取子集时一般返回向量,除非加上drop=FALSE,才会以列表的形式返回:
mtcars[,"mpg"]
## [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4
## [16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
## [31] 15.0 21.4
mtcars[,"mpg",drop=FALSE]
## mpg
## Mazda RX4 21.0
## Mazda RX4 Wag 21.0
## Datsun 710 22.8
## Hornet 4 Drive 21.4
## Hornet Sportabout 18.7
## Valiant 18.1
## Duster 360 14.3
## Merc 240D 24.4
## Merc 230 22.8
## Merc 280 19.2
## Merc 280C 17.8
## Merc 450SE 16.4
## Merc 450SL 17.3
## Merc 450SLC 15.2
## Cadillac Fleetwood 10.4
## Lincoln Continental 10.4
## Chrysler Imperial 14.7
## Fiat 128 32.4
## Honda Civic 30.4
## Toyota Corolla 33.9
## Toyota Corona 21.5
## Dodge Challenger 15.5
## AMC Javelin 15.2
## Camaro Z28 13.3
## Pontiac Firebird 19.2
## Fiat X1-9 27.3
## Porsche 914-2 26.0
## Lotus Europa 30.4
## Ford Pantera L 15.8
## Ferrari Dino 19.7
## Maserati Bora 15.0
## Volvo 142E 21.4
但在tibble数据框中则可以直接呈现单列的tibble数据框:
mtcars2[,"mpg"]
## # A tibble: 32 × 1
## mpg
## <dbl>
## 1 21
## 2 21
## 3 22.8
## 4 21.4
## 5 18.7
## 6 18.1
## 7 14.3
## 8 24.4
## 9 22.8
## 10 19.2
## # ℹ 22 more rows
4)不改变输入的类型(例如,不能将字符串转换为因子)。在R4.0.0以前的版本中,函数read.table(),as.data.frame()会默认将字符型数据转换为因子。AsFactors = FALSE可以取消该默认设置。
2.3 数据输入
这里介绍2种常用的,分别是从带分隔符的文本文件导入和从excel导入。
文本文件包括:纯文本文件,Markdown文件,HTML文件,XML文件,JSON文件,CSV文件,日志文件,配置文件,脚本文件。
2.3.1 从带分隔符的文本文件导入数据
2.3.1.1 定义
用函数read.table()来导入,此函数读入一个表格格式的文件并将其保存为一个数据框。语法:
mydataframe <- read.table(file,options)
其中,file是一个带分隔符的ASCII文本文件,options是控制如何处理数据的选项。常见选项有:
以studentgrades.csv的文本文件举例:
grades <- read.table("studentgrades.csv",header = TRUE,row.names = "studentID",sep = ",")
## Warning in read.table("studentgrades.csv", header = TRUE, row.names =
## "studentID", : incomplete final line found by readTableHeader on
## 'studentgrades.csv'
grades
## First Last Math Science Social
## 11 Bob Smith 90 80 67
## 12 Jane Weary 75 NA 80
## 10 Dan "Thornton,III" 65 75 70
## 40 Mary "O'Leary" 90 95 92
studentID现在是行名,不再有标签,也失去了前置0。
str(grades)
## 'data.frame': 4 obs. of 5 variables:
## $ First : chr "Bob" "Jane" "Dan" "Mary"
## $ Last : chr "Smith" "Weary" "\"Thornton,III\"" "\"O'Leary\""
## $ Math : int 90 75 65 90
## $ Science: int 80 NA 75 95
## $ Social : int 67 80 70 92
注:对于“Thornton,III”要用双引号包围住,否则R会将其读为2个值而出错。
我们重新导入上面的数据,并同时为每个变量指定一个类:
grades <- read.table("studentgrades.csv",header = TRUE,row.names = "studentID",
sep = ",",
colClasses = c("character","character","character","numeric","numeric","numeric"))
## Warning in read.table("studentgrades.csv", header = TRUE, row.names =
## "studentID", : incomplete final line found by readTableHeader on
## 'studentgrades.csv'
grades
## First Last Math Science Social
## 011 Bob Smith 90 80 67
## 012 Jane Weary 75 NA 80
## 010 Dan "Thornton,III" 65 75 70
## 040 Mary "O'Leary" 90 95 92
str(grades)
## 'data.frame': 4 obs. of 5 variables:
## $ First : chr "Bob" "Jane" "Dan" "Mary"
## $ Last : chr "Smith" "Weary" "\"Thornton,III\"" "\"O'Leary\""
## $ Math : num 90 75 65 90
## $ Science: num 80 NA 75 95
## $ Social : num 67 80 70 92
可以看到行名保留了前缀0
其他读取方法:
1)read.csv():默认header=T,sep=“,”
2)read.delim():默认默认header=T,sep=“
3)readr包:其中主要函数是read.delim(),辅助函数为read.csv()和read.tsv(),其优点是速度快,且可以推测每一列的数据类型。
2.3.2 导入Excel数据
2.3.2.1 方法
1)将excel数据导出为一个csv文件后,使用前面方法进行导入
2)用readxl包直接导入excel工作表:readxl可以用来读取.xls和.xlsx版本的excel文件
语法:
read_table(file,n)
file是excel工作簿的所在路径,n则为导入的工作表序号,工作表的第一行为变量名。
例如:
install.packages("readxl")
library(readxl)
## Warning: 程辑包'readxl'是用R版本4.3.2 来建造的
a <- "./test.xlsx"
mytest <- read_excel(a,2)
mytest
## # A tibble: 8 × 2
## `动物\r\n编号` `体重(g)`
## <chr> <dbl>
## 1 A71 18.7
## 2 A74 18.8
## 3 A79 18
## 4 A80 18.5
## 5 A81 18.7
## 6 A82 18.3
## 7 A83 20
## 8 A84 17.5
read_excel()可以指定某个单元区域(range=“mysheet!B2:G14”),例如:
a <- "./test.xlsx"
mytest1 <- read_excel(a,2,range ="A3:B8" )
mytest1
## # A tibble: 5 × 2
## A74 `18.8`
## <chr> <dbl>
## 1 A79 18
## 2 A80 18.5
## 3 A81 18.7
## 4 A82 18.3
## 5 A83 20
另外,xlsx,XLConnect,openxlsx包也可以处理excel文件。
往期回顾