【R语言从0到精通】-2-数据结构

通过上次的教程,我们已经安装好了R语言,且认识了基本的界面及操作,那么我们直接进入下一个问题,数据结构。

【R语言从0到精通】-1-下载R语言与R最基础内容-CSDN博客


2.1 数据结构概述

数据结构是一种组织和存储数据的方式,以便能够有效地访问和使用这些信息。它们是计算机科学中的一个核心概念,对于算法设计和程序开发至关重要。数据结构不仅涉及数据的物理存储方式,还包括如何操作和管理这些数据的方法。

在R语言中,有向量(Vector)矩阵(Matrix)数组(Array)数据框(Data Frame) 因子(Factor)列表(List)这几种,在我们平时的计算统计及生物信息分析中,都用得上,且很多时候,了解不同数据应该储存为什么形式的数据结构至关重要,我们也可以对不同的数据结构进行转换。

2.2 向量

我们通过代码来实现向量的理解,包括向量的创建、访问、修改、运算、合并等:

# 创建一个数值型向量
numeric_vector <- c(1, 2, 3, 4, 5)
print(numeric_vector)

# 创建一个字符型向量
character_vector <- c("apple", "banana", "cherry")
print(character_vector)

# 创建一个逻辑型向量
logical_vector <- c(TRUE, FALSE, TRUE)
print(logical_vector)

# 访问向量的元素
print(numeric_vector[3])  # 输出第三个元素
print(character_vector[2])  # 输出第二个元素
print(logical_vector[1])  # 输出第一个元素

# 修改向量的元素
numeric_vector[2] <- 10
character_vector[1] <- "orange"
logical_vector[3] <- FALSE
print(numeric_vector)
print(character_vector)
print(logical_vector)

# 向量的运算
sum_vector <- sum(numeric_vector)
print(sum_vector)

# 向量的长度
length_vector <- length(character_vector)
print(length_vector)

# 向量的拼接
combined_vector <- c(numeric_vector, character_vector)
print(combined_vector)

我们在向量这个类型中,可以储存数字、字符串和布尔运算三种类型,不同类型的向量可以进行合并,数字类型向量间可以进行计算。

2.3 矩阵

# 创建一个3x3的数值型矩阵
matrix_data <- matrix(1:9, nrow=3, ncol=3)
print(matrix_data)

# 访问矩阵的元素
print(matrix_data[2, 3])  # 输出第二行第三列的元素

# 修改矩阵的元素
matrix_data[1, 1] <- 10
print(matrix_data)

# 矩阵的运算
matrix_addition <- matrix_data + matrix(1:9, nrow=3, ncol=3)
print(matrix_addition)

# 矩阵的转置
matrix_transpose <- t(matrix_data)
print(matrix_transpose)

# 矩阵的逆
matrix_inverse <- solve(matrix_data)
print(matrix_inverse)

# 矩阵的行列式
matrix_determinant <- det(matrix_data)
print(matrix_determinant)

# 矩阵的特征值和特征向量
eigen_values <- eigen(matrix_data)$values
eigen_vectors <- eigen(matrix_data)$vectors
print(eigen_values)
print(eigen_vectors)

 我们可以创建一个矩阵,并进行数学运算,值得注意的是我们求矩阵的转置,在我们进行组学分析的时候,常常会得到一个关于样本和基因的矩阵,矩阵是二维的,如果超过二维,我们可以使用后面提到的数组,如果说行列数据是有标数据,那么我们可以使用数据框。

2.4 数组

 数组可以放置多维度的数据,因此方便在一个变量中储存巨量信息:

# 创建一个四维数组
array_data <- array(1:8, dim = c(2, 2, 2, 2))
print(array_data)

# 访问数组的元素
print(array_data[1, 1, 1, 1])  # 输出第一维第1个,第二维第1个,第三维第1个,第四维第1个元素

# 修改数组的元素
array_data[1, 1, 1, 1] <- 10
print(array_data)

# 数组的运算
array_addition <- array_data + array(1:8, dim = c(2, 2, 2, 2))
print(array_addition)

# 数组的切片
slice <- array_data[1,,,]
print(slice)

# 数组的广播
broadcast <- array_data + 1
print(broadcast)

# 数组的重塑
reshape <- aperm(array_data, c(2, 1, 3, 4))
print(reshape)

 2.5 数据框

 数据框是我们很常用的数据结构,因为我们在读取一个csv文件的时候,读进来就是以数据框的形式,我们也可以理解为数据框是一系列向量的集合。我们还是以程序来理解:

# 创建一个数据框
data <- data.frame(
  Name = c("John", "Jane", "Mike"),
  Age = c(25, 30, 28),
  Height = c(175, 165, 180)
)
print(data)

# 访问数据框的元素
print(data$Name)  # 输出Name列的所有元素
print(data[2, 3])  # 输出第二行第三列的元素

# 修改数据框的元素
data$Age[2] <- 35
print(data)

# 添加新的列
data$Weight <- c(70, 60, 80)
print(data)

# 删除列
data <- data[, -4]
print(data)

# 筛选行
filtered_data <- data[data$Age > 28, ]
print(filtered_data)

# 合并数据框
new_data <- data.frame(
  Name = c("John", "Jane", "Mike"),
  Salary = c(5000, 6000, 5500)
)
combined_data <- merge(data, new_data)
print(combined_data)

 我们可以以excel的概念去理解数据框。

2.6 因子

 在R语言中,因子(factor)是一种特殊的数据类型,主要用于表示分类数据。分类数据是指那些只能取有限个离散值的变量,比如性别(男/女)、血型(A/B/AB/O)、颜色(红/蓝/绿)等。因子将这些可能的取值称为“水平”(levels),并且每个水平都有一个对应的整数编码。
使用因子的好处在于,R语言在进行统计分析和绘图时,能够自动识别因子类型的数据,并根据其水平进行分组处理。这对于执行分类数据分析非常有用,比如在执行方差分析、卡方检验、逻辑回归等统计模型时,都需要用到因子类型的数据。

# 创建一个因子
factor_data <- factor(c("apple", "banana", "cherry", "apple", "banana"))
print(factor_data)

# 访问因子的元素
print(factor_data[2])  # 输出第二个元素

# 修改因子的元素
factor_data[1] <- "orange"
print(factor_data)

# 获取因子的水平
levels <- levels(factor_data)
print(levels)

# 获取因子的数量
nlevels <- nlevels(factor_data)
print(nlevels)

# 统计每个水平的数量
counts <- table(factor_data)
print(counts)

# 改变因子的水平
factor_data <- factor(factor_data, levels = c("apple", "banana", "cherry", "date"))
print(factor_data)

# 将因子转换为字符向量
character_vector <- as.character(factor_data)
print(character_vector)

 2.7 列表

列表是一个比较复杂的数据结构,里面可以含有我们上面提到了所有数据结构。

# 创建一个嵌套列表
nested_list <- list(
  name = "John",
  personal_info = list(
    age = 25,
    height = 175,
    weight = 70
  ),
  contact_info = list(
    phone = "1234567890",
    email = "john@example.com"
  )
)
print(nested_list)

# 访问嵌套列表的元素
print(nested_list$personal_info$age)  # 输出personal_info下的age元素

# 修改嵌套列表的元素
nested_list$personal_info$age <- 30
print(nested_list)

# 添加新的元素到嵌套列表
nested_list$personal_info$address <- "New York"
print(nested_list)

# 删除嵌套列表的元素
nested_list$contact_info <- NULL
print(nested_list)

# 列表的递归
recursive_list <- list(a = 1, b = list(c = 2, d = list(e = 3)))
print(recursive_list)

# 列表的扁平化
flattened_list <- unlist(recursive_list)
print(flattened_list)

2.8 简单处理数据的函数

 我们学习一些简单处理数据结构的函数:

length(object):这个函数用于显示对象中元素或成分的数量。例如,如果有一个向量v <- c(1, 2, 3, 4, 5),那么length(v)将返回5,表示向量中有5个元素。
dim(object):此函数用于显示某个对象的维度。对于矩阵或数组这样的多维对象来说,dim()函数会返回一个向量,表明该对象在每个维度上的大小。
str(object):这个函数用于显示某个对象的结构。当应用于数据框或其他复合对象时,它会展示对象的层级结构和各层级的详细信息。
class(object):这个函数用于显示某个对象的类或类型。例如,对于数值向量、字符向量或逻辑向量,class()函数会返回相应的类型标识。
mode(object):此函数用于显示某个对象的模式。模式指的是对象中元素的类型,例如数值型、字符型或逻辑型。
names(object):这个函数用于显示某对象中各成分的名称。对于向量、矩阵或数据框,names()函数可以返回一个向量,其中包含了对象的每个成分的名称。
c(object, object, ...):这个函数用于将对象合并入一个向量。它接受任意数量的参数,并将它们合并成一个大向量。
cbind(object, object, ...):这个函数用于按列合并对象。它将输入对象的对应列绑定在一起,形成一个新的矩阵或数据框。
rbind(object, object, ...):这个函数用于按行合并对象。它将输入对象的对应行绑定在一起,形成一个新的矩阵或数据框。
head(object):这个函数用于列出数据框的前几行。默认情况下,它会显示前6行。
tail(object):这个函数用于列出数据框的最后几行。同样地,默认情况下,它会显示最后6行。
ls():这个函数用于显示当前的环境中的对象列表。
rm(object, object, ...):这个函数用于删除一个或多个对象。

 2.9 小结

 数据的准备,数据的存储,一直是非常有挑战性的工作,关于数据结构,我们进行了简单了解,后面大家应该会在实践中融会贯通。

相关推荐

  1. R语言0精通】-2-数据结构

    2024-03-31 07:36:04       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-31 07:36:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-31 07:36:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-31 07:36:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-31 07:36:04       18 阅读

热门阅读

  1. 解释TCP和UDP之间的区别

    2024-03-31 07:36:04       17 阅读
  2. Linux-ntp-ptp-gptp

    2024-03-31 07:36:04       14 阅读
  3. C++入门

    C++入门

    2024-03-31 07:36:04      13 阅读
  4. Go的数据结构与实现【HashMap】

    2024-03-31 07:36:04       20 阅读
  5. go mod命令介绍

    2024-03-31 07:36:04       16 阅读
  6. Let`s move - sui move开发实战-dao(6)反馈

    2024-03-31 07:36:04       20 阅读
  7. math模块篇(七)

    2024-03-31 07:36:04       18 阅读
  8. 代码随想录算法训练营第三十四天|leetcode62、63题

    2024-03-31 07:36:04       17 阅读
  9. 【LeetCode热题100】【链表】LRU缓存

    2024-03-31 07:36:04       21 阅读