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) # 返回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)是两个不同的概念,前者表示缺失值或不可用值,后者表示非有效数值,比如\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: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 列表

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

  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]

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

猜你喜欢

转载自blog.csdn.net/qq_69383479/article/details/135173372