当前位置: 首页 > article >正文

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语言通过DatePOSIXt类处理日期和时间数据。这对于时间序列分析、事件历史分析等领域至关重要。例如,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语言是区分大小写的,因此Variablevariable会被视为两个不同的变量。

四、数据结构

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:要应用的函数,可以是内置函数(如meansum等)或自定义函数。
  • ...:可选参数,用于传递给函数的其他参数。
# 创建两个不同长度的向量
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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


http://www.kler.cn/a/574039.html

相关文章:

  • 单例模式的五种实现方式
  • MATLAB中lookAheadBoundary函数用法
  • 【前端基础】Day 6 CSS定位
  • 护照阅读器在汽车客运站流程中的应用
  • 洛谷P1102 A-B 数对
  • OceanBase-obcp-v3考试资料梳理
  • qt作业day5
  • Spring Cloud Alibaba学习 5- Seata入门使用
  • UE4 组件 (对话组件)
  • 6. PromQL的metric name(在node exporter复制下来交给AI解释的)
  • SpringCloud系列教程(十三):Sentinel流量控制
  • 【Elasticsearch】Index Lifecycle Management
  • C语言基础2
  • 设计模式 + java8方法引用 实现任意表的过滤器
  • 多线程-CompletableFuture
  • AI推理革新:Dynasor-CoT如何提升复杂任务效率
  • 【AI学习从零至壹】Pytorch逻辑回归
  • FreeRTOS 任务管理与运行时间统计:API 解析与配置实践
  • 模块15.常用API
  • QT.....................................5