R语言基础| 创建数据集
在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文件。
往期回顾
R语言基础学习手册
下载、安装
相关文章:

R语言基础| 创建数据集
在R语言中,有多种数据类型,用以存储和处理数据。每种数据类型都有其特定的用途和操作函数,使得R语言在处理各种数据分析任务时非常灵活和强大: 向量(Vector): 向量是R语言中最基本的数据类型,它…...
剑指offer15_数值的整数次方
数值的整数次方 实现函数 double Power(double base, int exponent) 题目要求 计算 base exponent \text{base}^{\text{exponent}} baseexponent: 不得使用库函数不需要考虑大数问题,绝对误差不超过 10 − 2 10^{-2} 10−2不会出现底数和指数同为 0…...

Centos7搭建zabbix6.0
此方法适用于zabbix6以上版本zabbix6.0前期环境准备:Lamp(linux httpd mysql8.0 php)mysql官网下载位置:https://dev.mysql.com/downloads/mysql/Zabbix源码包地址:https://www.zabbix.com/cn/download_sourcesZabbix6…...
使用Redis的四个常见问题及其解决方案
Redis 缓存穿透 定义:redis查询一个不存在的数据,导致每次都查询数据库 解决方案: 如果查询的数据为空,在redis对应的key缓存空数据,并设置短TTL。 因为缓存穿透通常是因为被恶意用不存在的查询参数进行压测攻击&…...

Docker 部署前后端分离项目
1.Docker 1.1 什么是 Docker ? Docker 是一种开源的 容器化平台,用于开发、部署和运行应用程序。它通过 容器(Container) 技术,将应用程序及其依赖项打包在一个轻量级、可移植的环境中,确保应用在不同计算…...

云游戏混合架构
云游戏混合架构通过整合本地计算资源与云端能力,形成了灵活且高性能的技术体系,其核心架构及技术特征可概括如下: 一、混合架构的典型模式 分层混合模式 前端应用部署于公有云(如渲染流化服务),后端逻辑…...

【小红书】API接口,获取笔记核心数据
小红书笔记核心数据API接口详解 - 深圳小于科技提供专业数据服务 深圳小于科技(官网:https://www.szlessthan.com)推出的小红书笔记核心数据API接口,为开发者提供精准的笔记互动数据分析能力,助力内容运营与商业决策。…...

会议室钥匙总丢失?换预约功能的智能门锁更安全
在企业日常运营中,会议室作为重要的沟通与协作场所,其管理效率与安全性直接影响着企业的运作顺畅度。然而,传统会议室管理方式中钥匙丢失、管理不便等问题频发,给企业带来了不少困扰。近期,某企业引入了启辰智慧预约系…...

Redis底层数据结构之跳表(SkipList)
SkipList是Redis有序结合ZSet底层的数据结构,也是ZSet的灵魂所在。与之相应的,Redis还有一个无序集合Set,这两个在底层的实现是不一样的。 标准的SkipList: 跳表的本质是一个链表。链表这种结构虽然简单清晰,但是在查…...
跨架构镜像打包问题及解决方案
问题背景: 需求: 有一个镜像是 docker.io 的,是 docker.io/aquasec/kube-bench:v0.10.6,我想把该镜像在本地电脑(可翻墙)下载下来,然后 docker save 打包成一个 tar 包,传输到服务器…...
云原生时代 Kafka 深度实践:05性能调优与场景实战
5.1 性能调优全攻略 Producer调优 批量发送与延迟发送 通过调整batch.size和linger.ms参数提升吞吐量: props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384); // 默认16KB props.put(ProducerConfig.LINGER_MS_CONFIG, 10); // 等待10ms以积累更多消息ba…...

Ubuntu安装Docker命令清单(以20.04为例)
在你虚拟机上完成Ubuntu的下载后打开终端!!! Ubuntu安装Docker终极命令清单(以20.04为例) # 1. 卸载旧版本(全新系统可跳过) sudo apt-get remove docker docker-engine docker.io containerd …...
使用 Python 制作 GIF 动图,并打包为 EXE 可执行程序
文章目录 成品百度网盘下载🎬 使用 Python 制作 GIF 动图,并打包为 EXE 可执行程序(含图形界面)🧰 环境准备💻 功能预览🧑💻 完整代码(图形界面 功能)如何…...

HarmonyOS Next 弹窗系列教程(2)
HarmonyOS Next 弹窗系列教程(2) 上一章节我们讲了自定义弹出框 (openCustomDialog),那对于一些简单的业务场景,不一定需要都是自定义,也可以使用 HarmonyOS Next 内置的一些弹窗效果。比如: 名称描述不依…...
Ubuntu 18.04 上源码安装 protobuf 3.7.0
🔧 1️⃣ 安装依赖 sudo apt update sudo apt install -y autoconf automake libtool curl make g unzip📥 2️⃣ 下载源码 cd ~ git clone https://github.com/protocolbuffers/protobuf.git cd protobuf git checkout v3.7.0⚙️ 3️⃣ 编译 & 安…...

中小企业搭建网站选择虚拟主机还是云服务器?华为云有话说
这是一个很常见的问题,许多小企业在搭建网站时都会面临这个选择。虚拟主机和云服务器都有各自的优缺点,需要根据自己的需求和预算来决定。 虚拟主机是指将一台物理服务器分割成多个虚拟空间,每个空间都可以运行一个网站。虚拟主机的优点是价格…...

使用 HTML + JavaScript 在高德地图上实现物流轨迹跟踪系统
在电商行业蓬勃发展的今天,物流信息查询已成为人们日常生活中的重要需求。本文将详细介绍如何基于高德地图 API 利用 HTML JavaScript 实现物流轨迹跟踪系统的开发。 效果演示 项目概述 本项目主要包含以下核心功能: 地图初始化与展示运单号查询功能…...

19-项目部署(Linux)
Linux是一套免费使用和自由传播的操作系统。说到操作系统,大家比较熟知的应该就是Windows和MacOS操作系统,我们今天所学习的Linux也是一款操作系统。 我们作为javaEE开发工程师,将来在企业中开发时会涉及到很多的数据库、中间件等技术&#…...

html基础01:前端基础知识学习
html基础01:前端基础知识学习 1.个人建立打造 -- 之前知识的小总结1.1个人简历展示1.2简历信息填写页面 1.个人建立打造 – 之前知识的小总结 1.1个人简历展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&qu…...
Golang学习之旅
Golang学习之旅:初探Go语言的奥秘 在当今这个快速发展的技术时代,编程语言层出不穷,每一种都有其独特的魅力和适用场景。作为一名对技术充满热情的开发者,我一直在探索新的知识,以提升自己的编程技能。最近࿰…...

【RoadRunner】自动驾驶模拟3D场景构建 | 软件简介与视角控制
💯 欢迎光临清流君的博客小天地,这里是我分享技术与心得的温馨角落 💯 🔥 个人主页:【清流君】🔥 📚 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 📚 🌟始终保持好奇心&…...

基于RK3576+FPGA芯片构建的CODESYS软PLC Linux实时系统方案,支持6T AI算力
基于RK3576芯片构建的CODESYS软PLC Linux实时系统方案,结合了异构计算架构与工业实时控制技术,主要特点如下: 一、硬件架构设计 异构多核协同 Cortex-A72四核(2.3GHz):处理运动轨迹规划、AI视觉等…...
鸿蒙OSUniApp复杂表单与动态验证实践:打造高效的移动端表单解决方案#三方框架 #Uniapp
UniApp复杂表单与动态验证实践:打造高效的移动端表单解决方案 引言 在移动应用开发中,表单处理一直是一个既常见又具有挑战性的任务。随着HarmonyOS生态的蓬勃发展,越来越多的开发者开始关注跨平台解决方案。本文将深入探讨如何使用UniApp框…...
在linux系统上搭建git服务器(ssh协议)
1.在windows上生成RSA密钥对 ssh-keygen -t rsa -b 2048 -C"git用户名/邮箱地址" 命令执行后会在 C:\Users\${windows登录账户}\.ssh 目录下生成密钥对 其中 id_rsa 为私钥,id_rsa.pub 为公钥 2.在 linux 系统上登记公钥 vim ~/.ssh/authorized_keys…...

适配器模式:让不兼容接口协同工作
文章目录 1. 适配器模式概述2. 适配器模式的分类2.1 类适配器2.2 对象适配器 3. 适配器模式的结构4. C#实现适配器模式4.1 对象适配器实现4.2 类适配器实现 5. 适配器模式的实际应用场景5.1 第三方库集成5.2 遗留系统集成5.3 系统重构与升级5.4 跨平台开发 6. 类适配器与对象适…...
NodeJS全栈开发面试题讲解——P12高性能场景题
12.1 设计一个高并发点赞接口,如何优化性能? 设计要点: 问题: 点赞操作是高频写操作,数据库直接写可能成为瓶颈。 优化方案: 缓存计数 异步落库 点赞先写缓存(Redis Hash / Sorted Set&…...

DDP与FSDP:分布式训练技术全解析
DDP与FSDP:分布式训练技术全解析 DDP(Distributed Data Parallel)和 FSDP(Fully Sharded Data Parallel)均为用于深度学习模型训练的分布式训练技术,二者借助多 GPU 或多节点来提升训练速度。 1. DDP(Distributed Data Parallel) 实现原理 数据并行:把相同的模型复…...

【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(1)——Chat Client API
Spring AI框架快速入门 一、前言二、前期准备2.1 运行环境2.2 maven配置2.3 api-key申请 三、Chat Client API3.1 导入pom依赖3.2 配置application.properties文件3.3 创建 ChatClient3.3.1 使用自动配置的 ChatClient.Builder3.3.2 使用多个聊天模型 3.4 ChatClient请求3.5 Ch…...

【笔记】在 MSYS2(MINGW64)中正确安装 Rust
#工作记录 1. 环境信息 Windows系统: MSYS2 MINGW64当前时间: 2025年6月1日Rust 版本: rustc 1.87.0 (17067e9ac 2025-05-09) (Rev2, Built by MSYS2 project) 2. 安装步骤 步骤 1: 更新系统包数据库并升级已安装的包 首先,确保我们的 MSYS2 系统是最新状态。打…...

从汇编的角度揭秘C++引用,豁然开朗
C中的引用是指已有对象的别名,可以通过该别名访问并修改被引用的对象。那么其背后的原理是什么呢?引用是否会带来额外的开销呢?我们从一段代码入手,来分析一下引用的本质。 #include <stdio.h> int main() {int a 10;int …...