R语言4——R的数据类型2
目录
R语言4——R的数据类型2
1、字符串
1.1 在字符串的语法中,单引号和双引号不能混用
1.2 字符串连接函数——paste()函数
1.3 字符串格式化函数——format()函数
1.4字符串计算长度函数——nchar()函数
1.5大小写转换函数——toupper()& tolower()函数
1.6截取字符串函数——substring()函数
2、列表
3.矩阵
1、创建矩阵函数——matrix()函数
2、转置矩阵函数——t()函数
3、访问矩阵元素
4、矩阵计算
4.数组
1、数组的创建——array()函数
2、访问数组元素
3、数组跨纬度的元素计算
1、字符串
1.1 在字符串的语法中,单引号和双引号不能混用
在字符串构造中应用的规则
- 在字符串的开头和结尾的引号应该是两个双引号或两个单引号。它们不能被混合。
- 双引号可以插入到以单引号开头和结尾的字符串中。
- 单引号可以插入以双引号开头和结尾的字符串。
- 双引号不能插入以双引号开头和结尾的字符串。
- 单引号不能插入以单引号开头和结尾的字符串。
1.2 字符串连接函数——paste()函数
函数的实例如下代码,paste()函数语法规则如下:
paste(..., sep = " ", collapse = NULL)
其中...,表示需要进行连接的字符串;
sep表示前面...的参数之间进行连接的连接符,默认是空格,可以自行设置。
collapse是在字符串之间进行操作,当前面传入的字符串参数a,b,c...字符串为单个字符串时,collapse参数的意义在于消除a,b,c...字符串之间的空格,但不包括字符串内部的空格。当前面传入的字符串参数是一个列表时,collapse可以使用我们设置的连接符(collapse的参数)为字符串进行连接并消除字符串之间的空格,不包括字符串内的空格。
> a <- "apple"
> b <- 'orange'
> c <- "water"
> paste(a,b,c)
[1] "apple orange water"
> paste(a,b,c, sep = "&")
[1] "apple&orange&water"
> paste(c(a,b,c), 1:3, ".pdf", sep = "")
[1] "apple1.pdf" "orange2.pdf" "water3.pdf"
> paste(c(a,b,c), sep = "",collapse = "&")
[1] "apple&orange&water"
> paste(c(a,b,c), 1:3, ".pdf", sep = "", collapse = "&")
[1] "apple1.pdf&orange2.pdf&water3.pdf"
#关于collapse与sep的区别
> paste(a,b,c, sep = "", collapse = "+")
[1] "appleorangewater"
> paste(c(a,b,c), sep = "", collapse = "+")
[1] "apple+orange+water"
如上所示,paste(a,b,c) 表示将a,b,c三个字符串连接成一个字符串,默认分隔符为空格。
paste(a,b,c, sep = "&") 表示使用"&"连接符连接三个字符串。
paste(c(a,b,c), 1:3, ".pdf", sep = "") 表示连接多个参数,可以批量输出文本/文件名
paste(a,b,c, sep = "", collapse = "+") 表示消除a,b,c三个字符串之间的空格连接成一个字符串
paste(c(a,b,c), sep = "", collapse = "+") 表示将元素进行折叠,并使用参数连接符进行连接。
1.3 字符串格式化函数——format()函数
format() 函数用于格式化字符串,format() 可作用于字符串或数字。
语法格式:format(x, digits, nsmall, scientific, width, justify = c("left", "right", "centre", "none"))
其中,x表示输入的向量;
digits表示需要显示的小数点位数;
nsmall表示小数点右边显示的最小位数;
science表示是否设置为科学计数法,参数为true/false
width表示通过在开头填充空白来显示最小宽度;
justify表示设置显示的位置,左边,右边,中间,其他。此时X参数的参数需要为字符串
> r <- format(12.345322223, digits = 5)
> r
[1] "12.345"
#digits=5表示可以保留五位数字,不包括小数点
> r <- format(12.345322223, nsmall = 5)
> r
[1] "12.34532"
> r <- format(12.345322223, nsmall = 2)
> r
[1] "12.34532"
#nsmall函数表示小数点右边最少的位数
> r <- format(1122.345322223, scientific = TRUE)
> r
[1] "1.122345e+03"
#scientific参数不需要带引号,true需要大写
> r <- format(11.23, width = 10)
> r
[1] " 11.23"
>
> r <- format("12.12", width = 10, justify = "c")
> r
[1] " 12.12 "
>
1.4字符串计算长度函数——nchar()函数
nchar() 函数用于计数字符串或数字列表的长度。 语法格式:nchar(x) , 其中,x 为向量或字符串
> r <- nchar("hello world!")
> r
[1] 12
>
1.5大小写转换函数——toupper()& tolower()函数
toupper() & tolower() 函数用于将字符串的字母转化为大写或者小写。
语法格式:toupper(x) tolower(x) 其中,x 为向量或字符串。
> r <- nchar("hello world!")
> r
[1] 12
> a <- toupper("hello world!")
> a
[1] "HELLO WORLD!"
> b <- tolower(a)
> b
[1] "hello world!"
>
1.6截取字符串函数——substring()函数
substring() 函数用于截取字符串。 语法格式:substring(x,first,last)
x : 向量或字符串
first : 开始截取的位置
last: 结束截取的位置,截取结果不包含
> str1 <- "hello world!hello world!"
> str <- substring(str1, 2 ,6)
> str
[1] "ello "
#注意在R中字符串的计数是从1开始计算的,所以2表示的是字母e
2、列表
创建列表使用 list() 函数。列表中的元素可以是数字、向量、字符串、列表本身、矩阵、函数。
> list_data <- list("white", "gogo", c(11,22,33), 123, 12.12, 119.1)
> list_data
[[1]]
[1] "white"
[[2]]
[1] "gogo"
[[3]]
[1] 11 22 33
[[4]]
[1] 123
[[5]]
[1] 12.12
[[6]]
[1] 119.1
使用names()函数给列表的元素命名:
# 列表包含向量、矩阵、列表
list_data <- list(c("Google","Runoob","Taobao"), matrix(c(1,2,3,4,5,6), nrow = 2),
list("runoob",12.3))
# 给列表元素设置名字
names(list_data) <- c("Sites", "Numbers", "Lists")
# 显示列表
print(list_data)
#输出结果如下:
$Sites
[1] "Google" "Runoob" "Taobao"
$Numbers
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
$Lists
$Lists[[1]]
[1] "runoob"
$Lists[[2]]
[1] 12.3
访问列表:
列表中的元素可以使用索引来访问,如果使用来 names() 函数命名后,我们还可以使用对应名字来访问:
# 列表包含向量、矩阵、列表
list_data <- list(c("Google","Runoob","Taobao"), matrix(c(1,2,3,4,5,6), nrow = 2),
list("runoob",12.3))
# 给列表元素设置名字
names(list_data) <- c("Sites", "Numbers", "Lists")
# 显示列表
print(list_data[1])
# 访问列表的第三个元素
print(list_data[3])
# 访问第一个向量元素
print(list_data$Numbers)
输出结果如下:
$Sites
[1] "Google" "Runoob" "Taobao"
$Lists
$Lists[[1]]
[1] "runoob"
$Lists[[2]]
[1] 12.3
[,1] [,2] [,3]
[1,] 1 3 5
合并列表:
# 创建两个列表
list1 <- list(1,2,3)
list2 <- list("Google","Runoob","Taobao")
# 合并列表
merged.list <- c(list1,list2)
# 显示合并后的列表
print(merged.list)
将列表转换为向量
> list1 <- list(1:5)
> print(list1)
[[1]]
[1] 1 2 3 4 5
> list1 <- list(1:5)
> print(list1)
[[1]]
[1] 1 2 3 4 5
>
> list2 <-list(10:14)
> print(list2)
[[1]]
[1] 10 11 12 13 14
> # 转换为向量
> v1 <- unlist(list1)
> v2 <- unlist(list2)
> v1
[1] 1 2 3 4 5
> v2
[1] 10 11 12 13 14
> result <- v1+v2
> print(result)
[1] 11 13 15 17 19
3.矩阵
1、创建矩阵函数——matrix()函数
我们看过的这部经典电影黑客帝国的英文名称就是matrix,电影里世界就是由矩阵组成的。
在R中使用 matrix() 函数来创建矩阵 matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,dimnames = NULL)
其中data表示矩阵中的数字;
nrow表示行数;ncol表示列数;
byrow表示逻辑值,byrow值为 FALSE 按列排列,为 TRUE 按行排列;
dimname 设置行和列的名称
> m <- matrix(c(1:10), nrow = 2, byrow = TRUE)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
>
#为矩阵设置行列名称
> rownames = c("r1", "r2", "r3", "r4")
> colnames = c("c1", "c2", "c3", "c4", "c5", "c6", "c7")
>
> m2 <- matrix(c(10:37), nrow =4 ,byrow = TRUE, dimnames = list(rownames, colnames))
> m2
c1 c2 c3 c4 c5 c6 c7
r1 10 11 12 13 14 15 16
r2 17 18 19 20 21 22 23
r3 24 25 26 27 28 29 30
r4 31 32 33 34 35 36 37
>
2、转置矩阵函数——t()函数
> M = matrix( c(2,6,5,1,10,4), nrow = 2,ncol = 3,byrow = TRUE)
> print(M)
[,1] [,2] [,3]
[1,] 2 6 5
[2,] 1 10 4
> print(t(M))
[,1] [,2]
[1,] 2 1
[2,] 6 10
[3,] 5 4
3、访问矩阵元素
如果想获取矩阵元素,可以通过使用元素的列索引和行索引,类似坐标形式。
> M[1,2]
[1] 6
> M[,2] #访问第二列
[1] 6 10
> M[1,] #访问第一行
[1] 2 6 5
>
4、矩阵计算
大小相同(行数列数都相同)的矩阵之间可以相互加减,具体是对每个位置上的元素做加减法。矩阵的乘法则较为复杂。两个矩阵可以相乘,当且仅当第一个矩阵的列数等于第二个矩阵的行数。
> # 创建 2 行 3 列的矩阵
> matrix1 <- matrix(c(7, 9, -1, 4, 2, 3), nrow = 2)
> print(matrix1)
[,1] [,2] [,3]
[1,] 7 -1 2
[2,] 9 4 3
>
> matrix2 <- matrix(c(6, 1, 0, 9, 3, 2), nrow = 2)
> print(matrix2)
[,1] [,2] [,3]
[1,] 6 0 3
[2,] 1 9 2
>
> # 两个矩阵相加
> result <- matrix1 + matrix2
> cat("相加结果:","\n")
相加结果:
> print(result)
[,1] [,2] [,3]
[1,] 13 -1 5
[2,] 10 13 5
>
> # 两个矩阵相减
> result <- matrix1 - matrix2
> cat("相减结果:","\n")
相减结果:
> print(result)
[,1] [,2] [,3]
[1,] 1 -1 -1
[2,] 8 -5 1
>
> # 创建 2 行 3 列的矩阵
> matrix1 <- matrix(c(7, 9, -1, 4, 2, 3), nrow = 2)
> print(matrix1)
[,1] [,2] [,3]
[1,] 7 -1 2
[2,] 9 4 3
>
> matrix2 <- matrix(c(6, 1, 0, 9, 3, 2), nrow = 2)
> print(matrix2)
[,1] [,2] [,3]
[1,] 6 0 3
[2,] 1 9 2
>
> # 两个矩阵相乘
> result <- matrix1 * matrix2
> cat("相加结果:","\n")
相加结果:
> print(result)
[,1] [,2] [,3]
[1,] 42 0 6
[2,] 9 36 6
>
> # 两个矩阵相除
> result <- matrix1 / matrix2
> cat("相减结果:","\n")
相减结果:
> print(result)
[,1] [,2] [,3]
[1,] 1.166667 -Inf 0.6666667
[2,] 9.000000 0.4444444 1.5000000
4.数组
数组也是 R 语言的对象,R 语言可以创建一维或多维数组。R 语言数组是一个同一类型的集合,前面的矩阵 matrix 其实就是一个二维数组。向量、矩阵、数组关系可以看下图:
1、数组的创建——array()函数
R 语言数组创建使用 array() 函数,该函数使用向量作为输入参数,可以使用 dim 设置数组维度。array() 函数语法格式如下:array(data = NA, dim = length(data), dimnames = NULL)
其中:data 向量,数组元素。
dim 数组的维度,默认是一维数组。
dimnames 维度的名称,必须是个列表,默认情况下是不设置名称的。
> v1 <- c(1,2,3)
> v2 <- c(2,3,4,5,6,7)
> v1
[1] 1 2 3
> v2
[1] 2 3 4 5 6 7
>
> v3 <- array(c(v1,v2), dim = c(3,3,2))
> v3
, , 1
[,1] [,2] [,3]
[1,] 1 2 5
[2,] 2 3 6
[3,] 3 4 7
, , 2
[,1] [,2] [,3]
[1,] 1 2 5
[2,] 2 3 6
[3,] 3 4 7
>
dimnames参数为数组命名:
> column.names <- c("COL1","COL2","COL3")
> row.names <- c("ROW1","ROW2","ROW3")
> matrix.names <- c("Matrix1","Matrix2")
> v4 <- array(c(v1,v2), dim = c(3,3,2), dimnames = list(row.names,column.names,matrix.names) )
> v4
, , Matrix1
COL1 COL2 COL3
ROW1 1 2 5
ROW2 2 3 6
ROW3 3 4 7
, , Matrix2
COL1 COL2 COL3
ROW1 1 2 5
ROW2 2 3 6
ROW3 3 4 7
2、访问数组元素
> v3
, , 1
[,1] [,2] [,3]
[1,] 1 2 5
[2,] 2 3 6
[3,] 3 4 7
> #显示第一个矩阵第一行
> print(v3[1,,1])
[1] 1 2 5
> #显示第一个矩阵第一行第三列的数字
> print(v3[1,3,1])
[1] 5
> #输出第二个矩阵
> print(v3[,,1])
[,1] [,2] [,3]
[1,] 1 2 5
[2,] 2 3 6
[3,] 3 4 7
3、数组跨纬度的元素计算
使用 apply() 元素对数组元素进行跨维度计算,语法格式如下:apply(x, margin, fun)
x 数组
margin 数据名称
fun 计算函数
以下我们使用 apply() 函数来计算数组两个矩阵中每一行对数字之和。
> # 创建两个不同长度的向量
> vector1 <- c(5,9,3)
> vector2 <- c(10,11,12,13,14,15)
>
> # 创建数组
> new.array <- array(c(vector1,vector2),dim = c(3,3,2))
> print(new.array)
, , 1
[,1] [,2] [,3]
[1,] 5 10 13
[2,] 9 11 14
[3,] 3 12 15
, , 2
[,1] [,2] [,3]
[1,] 5 10 13
[2,] 9 11 14
[3,] 3 12 15
>
> # 计算数组中所有矩阵第一的数字之和
> result <- apply(new.array, c(1), sum)
> print(result)
[1] 56 68 60