第一节 数字、字符与向量
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) # 返回FALSE
all(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 # 将缺失数据改成0
is.nan() # 检测数据是否为NaN
is.finite() # 检测数据是否有限(非NaN非无穷大)
补充:NA(Not Available)和NaN(Not a Number)是两个不同的概念,前者表示缺失值或不可用值,后者表示非有效数值,比如和就是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
的各个特殊属性组成的列表,但这个列表通常不包括固有属性 mode
和 length
。这个函数可以用于检查对象的附加信息和属性。
# 创建一个向量并为其添加特殊属性
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:12
dim(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 列表
列表是一种复合数据结构,可以包含多种不同类型的数据,包括向量、矩阵、数据框、函数等。列表的主要特点如下:
-
多类型元素:列表可以包含不同数据类型的元素,因此它是一种松散结构,允许在同一个列表中存储不同类型的数据。
-
使用列表索引:列表的元素可以使用索引来访问,每个元素可以有一个名称(标签)或使用数字索引进行访问。
-
创建列表:可以使用
list()
函数来创建列表。例如,通过以下方式创建一个包含不同类型元素的列表:my_list <- list(a = 1, b = "text", c = c(1, 2, 3))
这将创建一个名为 my_list
的列表,其中包含了整数、字符和数值向量等不同类型的元素。
-
访问列表元素:可以使用
$
运算符或[[ ]]
来访问列表的元素。例如,要访问列表中的元素可以使用以下方式:使用$
运算符:my_list$a
或my_list$b;
使用[[ ]]
运算符:my_list[["c"]]
。
5.2 数据框
数据框是一种二维数据结构,类似于表格或电子表格,它是R中最常用的数据结构之一。数据框的主要特点如下:
-
二维结构:数据框包含行和列,可以看作是一个二维表格,其中每一列可以包含不同数据类型的数据,但每一列的数据类型必须一致。
-
列名和行名:数据框的列(变量)有名称,可以通过列名来访问数据。同时,数据框的行可以有行名,也可以通过行名来访问数据。
-
创建数据框:可以使用
data.frame()
函数来创建数据框。例如,通过以下方式创建一个包含不同类型数据的数据框:my_df <- data.frame(ID = 1:3, Name = c("Alice", "Bob", "Charlie"))
这将创建一个名为
my_df
的数据框,其中包含了整数和字符数据类型的列("ID" 和 "Name")。 -
访问数据框元素:可以使用
$
运算符或[ ]
来访问数据框的列或元素。例如,要访问数据框中的列,可以使用以下方式:使用$
运算符:my_df$Name;
使用[ ]
运算符:my_df[1, 2]
。
(个人总结,如有谬误或需要改进之处欢迎联系作者)