R语言——数据类型
一、数据类型
1.数值型
一般型:123,0.125
科学计数型:1.23e2, -1.25E-1
2.字符串
它由字符(字符向量)组成,可以包含字母、数字、符号和空格等字符。
R 语言字符串可以使用一对单引号 ' ' 或一对双引号 " " 来表示。
- 单引号字符串中可以包含双引号。
- 单引号字符串中不可以包含单引号。
- 双引号字符串中可以包含单引号。
- 双引号字符串中不可以包含双引号。
3.逻辑型
这种类型只有两个可能的值,TRUE(真)或FALSE(假)。(注意区分大小写,必须是TRUE)
4.复数型
用于存储复数,即包含实部和虚部的数。z <- a+bi
5.因子类型
因子用于存储不同类别的数据类型,例如人的性别有男和女两个类别,年龄来分可以有未成年人和成年人。比如blood_type <- factor(c("A", "B", "O", "AB"))
。
factor(x = character(), levels, labels = levels,
exclude = NA, ordered = is.ordered(x), nmax = NA)
参数说明:
- x:向量。
- levels:指定各水平值, 不指定时由x的不同值来求得。
- labels:水平的标签, 不指定时用各水平值的对应字符串。
- exclude:排除的字符。
- ordered:逻辑值,用于指定水平是否有序。
- nmax:水平的上限数量。
sex = factor(c('男','女','男','男','女'),levels = c('男','女','中性'),labels = c('nv','nan','zhongxing'),ordered = TRUE)
print(sex)
输出:
[1] nv nan nv nv nan Levels: nv < nan < zhongxing
6.日期和时间
R语言通过Date
和POSIXt
类处理日期和时间数据。这对于时间序列分析、事件历史分析等领域至关重要。例如,Sys.Date()
函数返回当前日期,而as.Date("2023-01-01")
将字符串转换为日期对象。
二、基本操作符
算术操作符:这些操作符用于执行基本的数学运算,比如加(+)、减(-)、乘(*)、除(/)、求余数(%%)、整除(%/%)和幂(^)。例如,3 + 4的结果是7,8 / 2的结果是4。
比较操作符:这类操作符用来比较两个值的大小或相等性,包括小于(<)、大于(>)、小于等于(<=)、大于等于(>=)、等于(==)和不等于(!=)。比如,表达式5 > 3的结果是TRUE,因为5确实大于3。
逻辑操作符:用于逻辑运算,主要有逻辑与(&)、逻辑或(|)和逻辑非(!)。逻辑操作符经常用在条件测试中,比如TRUE & FALSE的结果是FALSE,!TRUE的结果是FALSE。
三、变量命名规则
在R语言中,变量名可以由字母、数字、点(.
)和下划线(_
)组成,但必须以字母或点开头。如果以点开头,则后面不能紧跟数字。R语言是区分大小写的,因此Variable
和variable
会被视为两个不同的变量。
四、数据结构
4.1向量(Vector)
向量是R语言中最基本的数据结构,它是由相同类型的元素组成的一维数组。你可以使用c()
函数来创建一个向量,例如:v <- c(1, 2, 3, 4, 5)
创建了一个包含五个元素的数值向量。
向量中的所有元素必须是相同的数据类型。
4.2矩阵(Matrix)
矩阵是一个二维数组,其中的元素按行和列排列。在R中,你可以使用matrix()
函数创建矩阵,指定其元素、行数和列数。例如:m <- matrix(1:9, nrow = 3, ncol = 3)
创建了一个3x3的矩阵。
矩阵中的所有元素必须属于同一数据类型。
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,dimnames = NULL)
参数说明:
-
data 向量,矩阵的数据
-
nrow 行数
-
ncol 列数
-
byrow 逻辑值,为 FALSE 按列排列,为 TRUE 按行排列,默认按列排列
-
dimname 设置行和列的名称
rowname = c('row1','row2','row3')
colname = c('col1','col2','col3')
p = matrix(c(1:9 ),nrow = 3,byrow = TRUE,dimnames = list(rowname,colname))
print(p)
print(p[1,2])
print(p[2,])
print(p['row1','col1'])
print(p['row1',])
4.2.1转置矩阵
R 语言矩阵提供了 t() 函数,可以实现矩阵的行列互换。
例如有个 m 行 n 列的矩阵,使用 t() 函数就能转换为 n 行 m 列的矩阵。
p1 = t(p) #转置
4.2.2矩阵的运算
加减法时两个矩阵维度相同
乘法时,第一个矩阵的列必须等于第二个矩阵的行
矩阵无除法
4.3数组(Array)
数组是矩阵的高维扩展,可以有两个以上的维度。使用array()
函数可以创建数组,例如:a <- array(1:8, dim = c(2, 2, 2))
创建了一个2x2x2的数组。
数组的所有元素必须是相同类型的。
array(data = NA, dim = length(data), dimnames = NULL)
参数说明:
- data - 指定数组的数据源,可以是一个向量、矩阵或列表。
- dim - 指定数组的维度,可以是一个整数向量或一个表示维度的元组,默认是一维数组。例如,dim = c(2, 3, 4) 表示创建一个 2x3x4 的三维数组。
- dimnames - 可选参数,用于指定数组每个维度的名称,可以是一个包含维度名称的列表。
my_arr = array(c(1:24),dim = c(2,3,4))
print(my_arr)
> my_arr = array(c(1:24),dim = c(2,3,4))
> print(my_arr)
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
, , 3
[,1] [,2] [,3]
[1,] 13 15 17
[2,] 14 16 18
, , 4
[,1] [,2] [,3]
[1,] 19 21 23
[2,] 20 22 24
# 创建两个不同长度的向量
vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)
column.names <- c("COL1","COL2","COL3")
row.names <- c("ROW1","ROW2","ROW3")
matrix.names <- c("Matrix1","Matrix2")
# 创建数组,并设置各个维度的名称
result <- array(c(vector1,vector2),dim = c(3,3,2),dimnames = list(row.names,column.names,matrix.names))
print(result)
> # 创建数组,并设置各个维度的名称
> result <- array(c(vector1,vector2),dim = c(3,3,2),dimnames = list(row.names,column.names,matrix.names))
> print(result)
, , Matrix1
COL1 COL2 COL3
ROW1 5 10 13
ROW2 9 11 14
ROW3 3 12 15
, , Matrix2
COL1 COL2 COL3
ROW1 5 10 13
ROW2 9 11 14
ROW3 3 12 15
可以使用矩阵(Matrix)或列表(List)来表示多维数组。
4.3.1矩阵表示数组
my_matrix <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, ncol = 3)
print(my_matrix)
4.3.2列表表示数组
列表是 R 中更通用的多维数组形式,它可以包含不同类型的元素,并且每个元素可以是一个矩阵、向量或其他数据结构。
# 创建一个包含矩阵和向量的列表
my_list <- list(matrix(c(1, 2, 3, 4), nrow = 2), c(5, 6, 7))
print(my_list)
> my_list <- list(matrix(c(1, 2, 3, 4), nrow = 2), c(5, 6, 7))
> print(my_list)
[[1]]
[,1] [,2]
[1,] 1 3
[2,] 2 4
[[2]]
[1] 5 6 7
4.3.3数组的访问
在 R 语言中,可以使用索引操作符 [ ] 来访问多维数组的元素。
my_array <- array(1:12, dim = c(2, 3, 2)) # 创建一个3维数组
print(my_array)
elements <- my_array[c(1, 2), c(2, 3), c(1, 2)] # 访问多个元素,其中每个维度的索引分别为1和2
print(elements)
# 显示数组第二个矩阵中第二行的元素
print(my_array[2,,2])
# 显示数组第一个矩阵中第一行第三列的元素
print(my_array[1,3,1])
# 输出第二个矩阵
print(my_array[,,2])
filtered_elements <- my_array[my_array > 5] # 选择大于5的元素
print(filtered_elements)
> my_array <- array(1:12, dim = c(2, 3, 2)) # 创建一个3维数组
> print(my_array)
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
> elements <- my_array[c(1, 2), c(2, 3), c(1, 2)] # 访问多个元素,其中每个维度的索引分别为1和2
> print(elements)
, , 1
[,1] [,2]
[1,] 3 5
[2,] 4 6
, , 2
[,1] [,2]
[1,] 9 11
[2,] 10 12
> # 显示数组第二个矩阵中第二行的元素
> print(my_array[2,,2])
[1] 8 10 12
> # 显示数组第一个矩阵中第一行第三列的元素
> print(my_array[1,3,1])
[1] 5
> # 输出第二个矩阵
> print(my_array[,,2])
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
> filtered_elements <- my_array[my_array > 5] # 选择大于5的元素
> print(filtered_elements)
[1] 6 7 8 9 10 11 12
4.3.4数组元素操作
由于数组是由多个维度的矩阵组成,所以我们可以通过访问矩阵的元素来访问数组元素。
# 创建两个不同长度的向量
vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)
# 创建数组
array1 <- array(c(vector1,vector2),dim = c(3,3,2))
print(array1)
# 创建两个不同长度的向量
vector3 <- c(9,1,0)
vector4 <- c(6,0,11,3,14,1,2,6,9)
array2 <- array(c(vector3,vector4),dim = c(3,3,2))
print(array2)
# 从数组中创建矩阵
matrix1 <- array1[,,2]
print(matrix1)
matrix2 <- array2[,,2]
print(matrix2)
# 矩阵相加
result <- matrix1+matrix2
print(result)
> # 创建两个不同长度的向量
> vector1 <- c(5,9,3)
> vector2 <- c(10,11,12,13,14,15)
>
> # 创建数组
> array1 <- array(c(vector1,vector2),dim = c(3,3,2))
> print(array1)
, , 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
>
> # 创建两个不同长度的向量
> vector3 <- c(9,1,0)
> vector4 <- c(6,0,11,3,14,1,2,6,9)
> array2 <- array(c(vector3,vector4),dim = c(3,3,2))
> print(array2)
, , 1
[,1] [,2] [,3]
[1,] 9 6 3
[2,] 1 0 14
[3,] 0 11 1
, , 2
[,1] [,2] [,3]
[1,] 2 9 6
[2,] 6 1 0
[3,] 9 0 11
>
> # 从数组中创建矩阵
> matrix1 <- array1[,,2]
> print(matrix1)
[,1] [,2] [,3]
[1,] 5 10 13
[2,] 9 11 14
[3,] 3 12 15
> matrix2 <- array2[,,2]
> print(matrix2)
[,1] [,2] [,3]
[1,] 2 9 6
[2,] 6 1 0
[3,] 9 0 11
>
> # 矩阵相加
> result <- matrix1+matrix2
> print(result)
[,1] [,2] [,3]
[1,] 7 19 19
[2,] 15 12 14
[3,] 12 12 26
apply(X, MARGIN, FUN, ...)
参数说明:
X
:要应用函数的数组或矩阵。MARGIN
:指定应用函数的维度,可以是1表示行,2表示列,或者c(1, 2)表示同时应用于行和列。FUN
:要应用的函数,可以是内置函数(如mean
、sum
等)或自定义函数。...
:可选参数,用于传递给函数的其他参数。
# 创建两个不同长度的向量
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)
# 计算数组中所有矩阵第一行的数字之和
result <- apply(new.array, c(1), sum)
print(result)
> # 创建两个不同长度的向量
> 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
>
# 创建一个3维数组
my_array <- array(1:12, dim = c(2, 3, 2))
print(my_array)
# 对第一个和第三个维度同时应用mean函数
result <- apply(my_array, c(1, 3), mean)
print(result)
> # 创建一个3维数组
> my_array <- array(1:12, dim = c(2, 3, 2))
> print(my_array)
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
> # 对第一个和第三个维度同时应用mean函数
> result <- apply(my_array, c(1, 3), mean)
> print(result)
[,1] [,2]
[1,] 3 9
[2,] 4 10
>
4.4 数据框(Data Frame)
数据框是R语言中最重要的数据结构之一,用于存储表格数据。它类似于一个矩阵,但不同之处在于数据框中的每列可以有不同的数据类型,是特殊的二维列表。 数据框每一列都有一个唯一的列名,长度都是相等的,同一列的数据类型需要一致,不同列的数据类型可以不一样。
data.frame(…, row.names = NULL, check.rows = FALSE,
check.names = TRUE, fix.empty.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
- …: 列向量,可以是任何类型(字符型、数值型、逻辑型),一般以 tag = value 的形式表示,也可以是 value。
- row.names: 行名,默认为 NULL,可以设置为单个数字、字符串或字符串和数字的向量。
- check.rows: 检测行的名称和长度是否一致。
- check.names: 检测数据框的变量名是否合法。
- fix.empty.names: 设置未命名的参数是否自动设置名字。
- stringsAsFactors: 布尔值,字符是否转换为因子,factory-fresh 的默认值是 TRUE,可以通过设置选项(stringsAsFactors=FALSE)来修改。
df = data.frame(姓名 = c("张三", "李四"),
工号 = c("001","002"),
月薪 = c(1000, 2000),
row.names = c('row1','row2'),
check.rows = TRUE,
check.names = TRUE)
print(df)
df1 = data.frame(df$姓名,df$工号)
print(df1)
print(df[1:2,]) #输出1-2行
print(df[1,2]) #输出1行2列数据
print(df[c(1,2),c(2,3)]) #输出1-2行,2-3列
df$部门 <- c("运营","技术") #扩展
print(df)
> df = data.frame(姓名 = c("张三", "李四"),
+ 工号 = c("001","002"),
+ 月薪 = c(1000, 2000),
+ row.names = c('row1','row2'),
+ check.rows = TRUE,
+ check.names = TRUE)
> print(df)
姓名 工号 月薪
row1 张三 001 1000
row2 李四 002 2000
> df1 = data.frame(df$姓名,df$工号)
> print(df1)
df.姓名 df.工号
1 张三 001
2 李四 002
> print(df[1:2,]) #输出1-2行
姓名 工号 月薪
row1 张三 001 1000
row2 李四 002 2000
> print(df[1,2]) #输出1行2列数据
[1] "001"
> print(df[c(1,2),c(2,3)]) #输出1-2行,2-3列
工号 月薪
row1 001 1000
row2 002 2000
> df$部门 <- c("运营","技术") #扩展
> print(df)
姓名 工号 月薪 部门
row1 张三 001 1000 运营
row2 李四 002 2000 技术
>
4.4.1多个向量合并成数据框 cbind()
# 创建向量
sites <- c("Google","Runoob","Taobao")
likes <- c(222,111,123)
url <- c("www.google.com","www.runoob.com","www.taobao.com")
# 将向量组合成数据框
addresses <- cbind(sites,likes,url)
# 查看数据框
print(addresses)
> # 创建向量
> sites <- c("Google","Runoob","Taobao")
> likes <- c(222,111,123)
> url <- c("www.google.com","www.runoob.com","www.taobao.com")
> # 将向量组合成数据框
> addresses <- cbind(sites,likes,url)
> # 查看数据框
> print(addresses)
sites likes url
[1,] "Google" "222" "www.google.com"
[2,] "Runoob" "111" "www.runoob.com"
[3,] "Taobao" "123" "www.taobao.com"
>
4.4.2数据框的合并rbind()
df = data.frame(
姓名 = c("张三", "李四","王五"),
工号 = c("001","002","003"),
月薪 = c(1000, 2000,3000)
)
newdf = data.frame(
姓名 = c("小明", "小白"),
工号 = c("101","102"),
月薪 = c(5000, 7000)
)
# 合并两个数据框
result <- rbind(df,newdf)
print(result)
> df = data.frame(
+ 姓名 = c("张三", "李四","王五"),
+ 工号 = c("001","002","003"),
+ 月薪 = c(1000, 2000,3000)
+ )
> newdf = data.frame(
+ 姓名 = c("小明", "小白"),
+ 工号 = c("101","102"),
+ 月薪 = c(5000, 7000)
+ )
> # 合并两个数据框
> result <- rbind(df,newdf)
> print(result)
姓名 工号 月薪
1 张三 001 1000
2 李四 002 2000
3 王五 003 3000
4 小明 101 5000
5 小白 102 7000
>
4.5列表(List)
列表是R语言中一种非常灵活的数据结构,它可以包含任意类型的数据,甚至可以包含其他列表。
列表是一种灵活的数据结构,可以存储和操作多种类型的数据对象。
list_data <- list("runoob", "google", c(11,22,33), 123, 51.23, 119.1)
print(list_data)
> list_data <- list("runoob", "google", c(11,22,33), 123, 51.23, 119.1)
> print(list_data)
[[1]]
[1] "runoob"
[[2]]
[1] "google"
[[3]]
[1] 11 22 33
[[4]]
[1] 123
[[5]]
[1] 51.23
[[6]]
[1] 119.1
>
我们也可以使用 c() 函数来创建列表,也可以使用该函数将多个对象合并为一个列表,例如:
my_list <- c(object1, object2, object3)
# 创建包含数字的向量
numbers <- c(1, 2, 3, 4, 5)
# 创建包含字符的向量
characters <- c("apple", "banana", "orange")
# 合并两个数字向量
merged_vector <- c(numbers, c("grape", "melon"))
print(merged_vector)
# 合并两个字符向量
merged_characters <- c(characters, c(6,7,8))
print(merged_characters)
> # 创建包含数字的向量
> numbers <- c(1, 2, 3, 4, 5)
> # 创建包含字符的向量
> characters <- c("apple", "banana", "orange")
> # 合并两个数字向量
> merged_vector <- c(numbers, c("grape", "melon"))
> print(merged_vector)
[1] "1" "2" "3" "4" "5" "grape" "melon"
> # 合并两个字符向量
> merged_characters <- c(characters, c(6,7,8))
> print(merged_characters)
[1] "apple" "banana" "orange" "6" "7" "8"
>
4.5.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)
> # 列表包含向量、矩阵、列表
> 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
>
4.5.2列表元素访问
# 列表包含向量、矩阵、列表
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)
print(list_data[1])
print(list_data$Numbers)
print(list_data[[3]])
> # 列表包含向量、矩阵、列表
> 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
> print(list_data[1])
$Sites
[1] "Google" "Runoob" "Taobao"
> print(list_data$Numbers)
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> print(list_data[[3]])
[[1]]
[1] "runoob"
[[2]]
[1] 12.3
4.5.3列表转向量unlist()
4.5.4函数应用于列表中的每一个元素lapply()
list_data = list(c(1,2,3),matrix(c(1:9),nrow = 3))
print(list_data)
list_data_new = lapply(list_data, mean)
print(list_data_new)
> list_data = list(c(1,2,3),matrix(c(1:9),nrow = 3))
> print(list_data)
[[1]]
[1] 1 2 3
[[2]]
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> list_data_new = lapply(list_data, mean)
> print(list_data_new)
[[1]]
[1] 2
[[2]]
[1] 5