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

R语言基础 | 安徽某高校《统计建模与R软件》期末复习

第一节 数字、字符与向量

1.1 向量的赋值

c<-(1,2,3,4,5)

1.2 向量的运算

对于向量,我们可以直接对其作加(+),减(-),乘(*),除(/),乘方(^{}),整数除法(%/%),求余(%%)运算,其含义就是对向量的每一个元素进行运算。

1.3 向量运算函数

    min(x) # 返回最小值max(x) # 返回最大值range(x) # 返回最小值和最大值which.min(x) # 返回最小值的下标which.max(x) # 返回最大值的下标sum(x) # 元素求和prod(x) # 元素连乘length(x) # 向量长度median(x) # 中位数mean(x) # 均值var(x) # 方差sd(x) # 标准差sort(x) # 排序order(x) # 返回排序后的索引

1.4 逻辑向量

逻辑向量是一种用于存储逻辑(布尔)值的数据结构。逻辑向量可以包含两种可能的值:TRUE(真)和FALSE(假),用来表示逻辑条件的结果或逻辑操作的输出。

    all(c(1,2,3)>2) # 返回FALSEall(c(1,2,3)>2) # 返回TRUE
x <- c(1, 2, 3, 4, 5)
logical_vector <- ifelse(x > 3, TRUE, FALSE)
# logical_vector 包含 FALSE FALSE FALSE TRUE TRUE

1.5 生成有规律的序列

    # 生成等差数列a:b# 等间隔函数s1<-seq(-5,5,by=2) # 生成间隔为2,从-5到5的等间隔序列# 重复函数rep()s1<-rep(x,times=3)

1.6 缺失数值的操作

    z<-c(1:3,NA) # 用NA表示缺失的数据is.na(z) # 逐个检测是否为缺失数据,TRUE则表示缺失z[is.na(z)]<-0 # 将缺失数据改成0is.nan() # 检测数据是否为NaNis.finite() # 检测数据是否有限(非NaN非无穷大)  

补充:NA(Not Available)和NaN(Not a Number)是两个不同的概念,前者表示缺失值或不可用值,后者表示非有效数值,比如\frac{0}{0}\sqrt{-2}就是NaN。

1.7 字符型向量

字符型向量是R语言中的一种数据结构,用于存储文本数据或字符串。字符型向量可以包含任何文本字符,如字母、数字、符号等,并且可以包含不同长度的字符串。

    k<-c("jerry","lin")

paste()函数用于将多个元素(字符向量、数值、逻辑值等)组合成一个字符串,可以指定分隔符来连接这些元素。例如:

# 简单的连接字符型向量
fruits <- c("apple", "banana", "cherry")
result <- paste(fruits, collapse = ", ")
# result 包含 "apple, banana, cherry"# 使用不同的分隔符
numbers <- c(1, 2, 3, 4)
result <- paste(numbers, sep = "-")
# result 包含 "1-2-3-4"
result <- paste("x",numbers,sep = "-")
# result 包含 "x-1" "x-2" "x-3" "x-4"# 连接多个对象
name <- "John"
age <- 30
result <- paste("My name is", name, "and I am", age, "years old.")
# result 包含 "My name is John and I am 30 years old."

1.8 复数向量

# 创建一个复数
z <- complex(real = 3, imaginary = 4)# 计算实部
real_part <- Re(z)
cat("Real part:", real_part, "\n")# 计算虚部
imaginary_part <- Im(z)
cat("Imaginary part:", imaginary_part, "\n")# 计算模
modulus <- Mod(z)
cat("Modulus:", modulus, "\n")# 计算幅角(以弧度为单位)
argument <- Arg(z)
cat("Argument (in radians):", argument, "\n")

1.9 下标

1.9.1 下标的顺序访问

    x<-(1,2,3)x[2] # 访问向量x的第二个元素

1.9.2 下标的逻辑访问

    x<-c(1,2,3)x[x<3] # 访问向量中所有小于3的元素

1.9.3 下标的名称访问

# 创建一个有命名元素的向量
fruit_prices <- c(apple = 1.2, banana = 0.8, cherry = 2.5, orange = 1.0)# 访问向量的元素通过名字
apple_price <- fruit_prices["apple"]
# 也可以使用$符号来访问
banana_price <- fruit_prices$banana

第二节 对象

2.1 对象的分类

可以将对象分为两类:单纯对象(atomic vectors)和复合对象(lists)。

  • 单纯对象是R中的基本数据结构,它们包含具有相同数据类型的元素。
  • R中常见的单纯对象类型包括:
    • 向量(Vectors):包括数值向量、字符向量、逻辑向量、复数向量等,每个向量的元素都是相同的数据类型。
    • 因子(Factors):用于表示分类数据,每个因子的元素属于一个有限的类别。
    • 整数向量(Integer Vectors):包括整数类型的向量。

复合对象(Lists):

  • 复合对象是R中的数据结构,它们可以包含不同数据类型的元素,因此被称为“复合”对象。
  • 复合对象通常用于组织和存储各种数据类型的数据,可以包含向量、数据框、单纯对象、其他复合对象等。
  • 列表(List)是R中最常见的复合对象类型,它允许你创建包含不同类型的元素的数据结构。

2.2 对象的基本属性

对象具有两个基本属性:类型(Mode)属性和长度(Length)属性。这些属性对于操作和分析数据非常重要。可以使用不同的函数来检测对象的类型和长度,以便更好地理解和操作数据。

对象类型(Mode)属性:

  • 你可以使用 mode() 函数来获取对象的类型属性。
  • 也可以使用 is.*() 函数系列来检测对象的类型,这些函数返回逻辑值(TRUE或FALSE),用于判断对象是否属于特定类型。
  • 例如,is.numeric() 检测对象是否为数值类型,is.character() 检测对象是否为字符类型,is.data.frame() 检测对象是否为数据框等。

对象长度(Length)属性:

  • 你可以使用 length() 函数来获取对象的长度属性,它告诉你对象中包含的元素数量。
  • 对于复合对象,比如列表或数据框,length() 返回的是元素的数量,而不是元素的总数。

2.3 强制类型转换

你可以使用 as. 开头的一系列函数来进行类型转换,以将一个对象强制转换为另一种数据类型。这些函数通常用于将对象从一种数据类型转换为另一种,以满足特定的计算或分析需求。例如:

x <- "123"
x_numeric <- as.numeric(x)y <- 5.7
y_integer <- as.integer(y)z <- 123
z_character <- as.character(z)a <- 0
a_logical <- as.logical(a)b <- c("red", "green", "blue", "red")
b_factor <- as.factor(b)

2.4 attributes和attr函数

你可以使用 attributes(object) 函数来获取对象 object 的各个特殊属性组成的列表,但这个列表通常不包括固有属性 modelength。这个函数可以用于检查对象的附加信息和属性。

# 创建一个向量并为其添加特殊属性
x <- c(1, 2, 3, 4, 5)
attr(x, "description") <- "This is a numeric vector"# 获取对象的特殊属性
attr_list <- attributes(x)
print(attr_list)

在这个示例中,我们首先创建了一个名为 x 的数值向量,并使用 attr() 函数为它添加了一个特殊属性 "description"。然后,我们使用 attributes() 函数来获取 x 的特殊属性列表。

2.5 自动伸长和强制压缩

在R语言中,允许对超出对象长度的下标进行赋值,这个特性通常被称为"自动伸长"。当你使用超出对象长度的下标进行赋值时,R会自动扩展对象的长度,并将未赋值的元素初始化为缺失值(NA)。这可以方便地向对象添加新元素或修改现有元素。我们也可以通过直接修改length值对对象进行压缩。例如:

# 创建一个向量
x <- c(1, 2, 3)# 使用超出对象长度的下标赋值(自动伸长)
x[5] <- 6
# 现在向量x变为 1 2 3 NA 6# 缩短对象长度
x <- x[1:3]
# 向量x变为 1 2 3# 直接给长度赋值
length(x) <- 2
# 向量x变为 1 2

2.6 class属性

在R语言中,可以使用特殊的class属性来支持面向对象的编程风格,这允许你定义自己的对象类,并为这些类定义不同的方法。通过给对象设置不同的class属性,你可以使通用函数(如print()plot()等)根据对象的类别执行不同的操作,实现多态性。

第三节 因子

3.1 变量的类别

3.1.1 区间变量

区间变量是一种连续的数值变量,可以进行各种数学运算,如求和、平均值、差值等。
它们可以用数值来表示,并且数值之间具有加减乘除的意义。
区间变量通常表示一定范围内的度量,如温度、年龄等。

3.1.2 名义变量

名义变量是一种离散的变量,可以用数值或字符型值来表示,但具体数值没有数学运算的意义。
名义变量主要用于分类或计数,用来表示不同的类别或类别之间的差异。
例子包括性别、省份、职业等。

3.1.3 有序变量

有序变量是一种离散的变量,可以用数值或字符型值来表示,但具有顺序或排序的含义。
虽然有序变量的数值有意义,但仅限于表示它们的相对顺序,而不支持加减乘除等数学运算。
有序变量通常用于表示等级、名次、满意度等具有明显排序关系的情况,如班级、名次等。

3.2 factor、levels、table函数

    sex<-c("M","F","M","M","F")sexf<-factor(sex) # 创建因子sexl<-levels(sexf) # 得到因子的水平,即不同的类别标签sext<-table(sexf) # 统计频数

3.3 apply和tapply函数

3.3.1 apply函数

  • apply 函数用于在矩阵或数组的行或列上执行函数操作。它可以对数据的行或列进行操作,而不仅仅是单一的向量。
  • apply 函数的语法为:apply(X, MARGIN, FUN),其中:
    • X 是要操作的矩阵或数组。
    • MARGIN 指定了要操作的维度,通常为1表示行,2表示列,或者其他维度的索引。
    • FUN 是要应用的函数,通常是自定义的或内置的R函数。

示例:

# 创建一个矩阵
mat <- matrix(1:12, nrow = 3, ncol = 4)# 使用apply函数计算每列的和
col_sums <- apply(mat, 2, sum)

3.3.2 tapply函数

  • tapply 函数用于按照一个或多个因子变量对数据进行拆分(分组),然后在每个分组上应用一个函数,并将结果整合成一个列表或向量。
  • tapply 函数的语法为:tapply(X, INDEX, FUN),其中:
    • X 是要操作的数据向量。
    • INDEX 是一个或多个因子变量,用于定义数据的分组。
    • FUN 是要应用于每个分组的函数。

示例:

# 创建一个数据框
df <- data.frame(gender = c("M", "F", "M", "F", "M"),score = c(80, 85, 78, 92, 88)
)# 使用tapply函数按性别分组计算平均分
avg_score_by_gender <- tapply(df$score, df$gender, mean)

3.4 gl函数

gl()函数是用于创建因子的函数,特别适用于生成重复的因子水平:

gl(n, k, labels = NULL, length = n * k, ordered = FALSE)
  • n:一个正整数,表示每个水平要重复的次数。
  • k:一个正整数,表示总的水平数。
  • labels:一个字符向量,包含了水平的标签。如果未指定,将使用默认标签。
  • length:生成的因子向量的长度。
  • ordered:一个逻辑值,表示生成的因子是否应该是有序的,默认为FALSE。

第四节 多维数组和矩阵

4.1 数组和矩阵的生成

4.1.1 向量直接生成

向量只有定义了维数向量(dim属性)后才能被看作是数组,⽐如:

    z<-1:12dim(z)<-c(3,4)

注意:矩阵的元素是按列存放的。

4.1.2 array函数

array() 函数是R语言中用于创建多维数组的函数。多维数组是一种数据结构,可以存储多个维度的数据。array() 函数允许你指定数据、维度和维度名称,以便创建具有特定结构的数组。

data <- c(1, 2, 3, 4, 5, 6)
# 创建一个二维数组,并指定维度和维度名称
arr <- array(data, dim = c(2, 3), dimnames = list(c("Row1", "Row2"), c("Col1", "Col2", "Col3")))
  • data:要存储在数组中的数据,通常是一个向量或矩阵。
  • dim:一个整数向量,指定了数组的维度,它定义了数组的形状和结构。
  • dimnames:一个包含行和列名称的列表,用于指定数组的维度名称。

4.1.3 matrix函数

    matrix(data, nrow = , ncol = , byrow = FALSE, dimnames = NULL)
  • data:用于填充矩阵的数据,可以是向量或其他可转换为矩阵的数据结构。
  • nrow:矩阵的行数。
  • ncol:矩阵的列数。
  • byrow:一个逻辑值,用于指定数据填充矩阵的方式。如果为TRUE,则按行填充;如果为FALSE(默认值),则按列填充。
  • dimnames:一个包含行名和列名的列表,用于指定矩阵的行名和列名。

4.2 数组的下标

数组与向量⼀样,可以对数组中的某些元素进⾏访问,或进⾏运算:

# 选择下标为(1, 2, 1)的元素
a[1, 2, 1]# 选择下标为(1, 2, 1)和(1, 3, 1)的元素
a[1, 2:3, 1]# 选择所有第一维下标为1的元素
a[1,,]# 选择整个数组(返回整个数组的副本)
a[]# 对数组的数据向量取子集,选择从第三个元素到第十个元素
a[3:10]

4.3 矩阵的运算

# 转置运算
t(A)# 求方阵的行列式
det(A)# 计算向量x和y的内积
x %*% y# 计算向量x和y的内积(另一种方式)
crossprod(x, y)# 计算向量x和y的外积
x %o% y# 计算向量x和y的外积(等价于x %*% t(y))
tcrossprod(x, y)# 获取矩阵A的对角线元素(若A为向量,则创建对角阵)
diag(A)# 解线性方程组Ax=b
solve(A, b)# 求矩阵A的特征值和特征向量
eigen(A)# 求矩阵A的秩
rank(A)# 对矩阵A进行奇异值分解
svd(A)# 对矩阵A进行QR分解
qr(A)

第五节 列表与数据框

5.1 列表

列表是一种复合数据结构,可以包含多种不同类型的数据,包括向量、矩阵、数据框、函数等。列表的主要特点如下:

  1. 多类型元素:列表可以包含不同数据类型的元素,因此它是一种松散结构,允许在同一个列表中存储不同类型的数据。

  2. 使用列表索引:列表的元素可以使用索引来访问,每个元素可以有一个名称(标签)或使用数字索引进行访问。

  3. 创建列表:可以使用 list() 函数来创建列表。例如,通过以下方式创建一个包含不同类型元素的列表:

    my_list <- list(a = 1, b = "text", c = c(1, 2, 3))
    

         这将创建一个名为 my_list 的列表,其中包含了整数、字符和数值向量等不同类型的元素。

  1. 访问列表元素:可以使用 $ 运算符或 [[ ]] 来访问列表的元素。例如,要访问列表中的元素可以使用以下方式:使用 $ 运算符:my_list$amy_list$b;使用 [[ ]] 运算符:my_list[["c"]]

5.2 数据框

数据框是一种二维数据结构,类似于表格或电子表格,它是R中最常用的数据结构之一。数据框的主要特点如下:

  1. 二维结构:数据框包含行和列,可以看作是一个二维表格,其中每一列可以包含不同数据类型的数据,但每一列的数据类型必须一致。

  2. 列名和行名:数据框的列(变量)有名称,可以通过列名来访问数据。同时,数据框的行可以有行名,也可以通过行名来访问数据。

  3. 创建数据框:可以使用 data.frame() 函数来创建数据框。例如,通过以下方式创建一个包含不同类型数据的数据框:

    my_df <- data.frame(ID = 1:3, Name = c("Alice", "Bob", "Charlie"))
    

    这将创建一个名为 my_df 的数据框,其中包含了整数和字符数据类型的列("ID" 和 "Name")。

  4. 访问数据框元素:可以使用 $ 运算符或 [ ] 来访问数据框的列或元素。例如,要访问数据框中的列,可以使用以下方式:使用 $ 运算符:my_df$Name;使用 [ ] 运算符:my_df[1, 2]

(个人总结,如有谬误或需要改进之处欢迎联系作者)

相关文章:

  • 力扣题目学习笔记(OC + Swift)21. 合并两个有序链表
  • oracle定位造成卡顿的SQL语句
  • Python 查杀进程的方法封装
  • ThunderSearch(闪电搜索器)_网络空间搜索引擎工具_信息收集
  • unity HoloLens2开发,使用Vuforia识别实体 触发交互(二)(有dome)
  • Hadoop入门学习笔记——五、在虚拟机中部署Hive
  • c++11 标准模板(STL)(std::pair)(七)访问 pair 的一个元素
  • 【华为OD题库-110】反转每对括号间的子串-java
  • Promise,async和js的事件循环机制
  • FPFA.一种二倍频电路代码描述以及测量详情
  • jar混淆,防止反编译,Allatori工具混淆jar包
  • springboot对接WebSocket实现消息推送
  • SpringBoot 3 集成Hive 3
  • 第十五节TypeScript 接口
  • 【MySQL】:超详细MySQL完整安装和配置教程
  • __proto__ 和 prototype的关系
  • 2019.2.20 c++ 知识梳理
  • canvas 高仿 Apple Watch 表盘
  • canvas 绘制双线技巧
  • CSS实用技巧干货
  • es6--symbol
  • maya建模与骨骼动画快速实现人工鱼
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • PHP的类修饰符与访问修饰符
  • react 代码优化(一) ——事件处理
  • React中的“虫洞”——Context
  • SegmentFault 2015 Top Rank
  • vagrant 添加本地 box 安装 laravel homestead
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Yeoman_Bower_Grunt
  • 彻底搞懂浏览器Event-loop
  • 高性能JavaScript阅读简记(三)
  • 那些年我们用过的显示性能指标
  • 赢得Docker挑战最佳实践
  • 2017年360最后一道编程题
  • linux 淘宝开源监控工具tsar
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​水经微图Web1.5.0版即将上线
  • $.proxy和$.extend
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (汇总)os模块以及shutil模块对文件的操作
  • (论文阅读40-45)图像描述1
  • (转)Linq学习笔记
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .net打印*三角形
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理