初见R语言(1)

前言

截至文章发布前,笔者正在学习R语言,以下是学习过程中的一些记录

基本运算符

R 复制代码
a <- 5 # 赋值

b <- 3 # 赋值

sum_result <- a + b # 加

diff_result <- a - b # 减

prod_result <- a * b # 乘

quot_result <- a / b # 除

此外还有:

R 复制代码
%/% # 整除
%% # 取余
%in% # 前是否在后中

向量操作

创建向量

R 复制代码
v <- c(1, 2, 3, 4, 5) # 使用函数c(元素表列)

为元素赋予别名

R 复制代码
names(v) <- c("a", "b", "c", "d", "e") # 使用names(v) 和 <- 运算符组成setter,传入另一个向量设置各个元素的别名

访问元素

R 复制代码
v[1] # 使用下标访问(R中数组下标从0开始)

v["c"] # 在设置完别名后可使用别名访问

数据结构

  • 数字字面量:1,2.5...
  • 字符串字面量:"ABC"(需要转义), '123'(不需要转义)
  • 逻辑向量:TRUE, FALSE
  • 向量(Vector):使用c()函数创建的向量
  • 矩阵(Matrix):使用matrix()函数创建的矩阵
    • 维度最高n\timesn
    • 元素必须是同一类型
R 复制代码
mat <- matrix(1:9, nrow = 3, ncol = 3)
  • 数组(Array):使用array()函数创建的数组
    • 维度无上限
    • 元素必须是同一类型
R 复制代码
arr <- array(1:18, dim = c(3, 3, 2))
  • 数据框(DataFrame):使用data.frame()创建的数据表
    • 维度最高n\timesn
    • 元素可以为不同类型
R 复制代码
df <- data.frame(
  Name = c("Alice", "Bob", "Charlie"),
  Age = c(25, 30, 35),
  Gender = c("F", "M", "M")
)
  • 列表(List):
    • 可以包含其他数据结构的成员
    • 元素可以为不同类型
R 复制代码
my_list <- list(
  name = "Alice",
  age = 25,
  scores = c(85, 90, 78),
  matrix = matrix(1:9, nrow = 3)
)

一些函数

运算

  • mean(x):求算术平均值(Arithmetic mean),第一个函数接受一个向量
  • median(x):求中位数(Median Value),第一个函数接受一个向量
  • sd(x):求样本的无偏估计标准差(Standard Deviation),第一个函数接收一个向量
  • sum(x):累和,第一个函数接收一个向量
  • prod(x):累积,第一个函数接收一个向量

属性

  • length(),dim(),nrow(),ncol():分别返回元素的个数/结构(接受矩阵,数组或数据框)的维度/结构(接受向量,数组或数据框)列的数量/行的数量

查找和排序

  • which(x):接受一个逻辑表达式(适用于向量或数组),返回该结构(向量或数组)满足此逻辑表达式情况下的索引下标
  • sort(x):排序,默认升序
  • order(x):返回排序完毕后(默认升序)每个元素此时的索引下标
  • table(...):接受任意个数的各种结构,输出结构中各个值或组合出现的次数

生成

  • rep(x, times = 1):接受一个结构,默认形参times为次数,输出重复times的结构
  • seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)):按照fromend依照步长by生成数组

集合运算

  • setdiff(A, B):返回A,B两结构的差集
  • union(A, B):返回A,B两结构的并集
  • intersect(A, B):返回A,B两结构的交集

抽样

  • sample(x, size, replace=FALSE):从x中抽样选择size个元素,其中默认形参replace表示是否放回抽样,默认为不放回

绘图

  • hist(data, breaks=6, col="lightblue", main="Histogram Example", xlab="Value", ylab="ABC"):绘制直方图(Histogram),
    • 其中默认形参breaks控制区间
      • 可以直接指定一个整数,表示将数据分成多少个区间
      • 可以通过一个向量直接指定每个区间的边界
      • 也可以是一个字符串,指定使用某种算法来计算区间数量或边界。常见的算法包括:
        • "Sturges"(默认值):适用于较小的数据集,基于数据的范围和数量计算区间。
        • "Scott":适用于近似正态分布的数据,根据数据的标准差和样本大小计算区间。
        • "FD"(Freedman-Diaconis):适用于有偏态分布或有离群值的数据,基于四分位距和样本大小计算区间。
    • col控制颜色
    • main控制上方标题
    • xlab, ylab控制轴上的标题
  • plot(x, y, main="Scatter Plot", xlab="X-Axis", ylab="Y-Axis"):绘制散点图,其中x,y为点集

实战(概率统计)

情景:掷骰子,古典概型问题

R 复制代码
# 样本空间,各基本事件为骰子上的数
omega <- c(1, 2, 3, 4, 5, 6)
# 事件
A <- c(1, 3, 5)
# 各个数出现的概率
probability <- rep(1/6, 6)
# 将概率集中的每个概率给予别名,即骰子上的数,那么现在就有 (数 -> 概率)的对应
names(probability) <- omega

最后输出probability

R 复制代码
probability

1 2 3 4 5 6
1/6 1/6 1/6 1/6 1/6 1/6

现在尝试计算A发生的概率

R 复制代码
# 样本空间中在事件A内的数,由对应关系得到概率,再累加,赋予P_A
P_A <- sum(probability[omega %in% A])

输出P_A

R 复制代码
P_A

[1] 0.5

A的逆事件(对立事件)

R 复制代码
Ac <- setdiff(omega, A)

即可获得A^c

R 复制代码
Ac

[1] 2 4 6

情景:掷两次骰子,重复1000次,研究点数和的分布

R 复制代码
# 设置随机数种子
set.seed(123)
# 模拟掷两次骰子,抽样1000次
# 我们将得到长度为1000的向量,每个元素为点数的和
dice_rolls <- sample(1:6, 1000, replace=TRUE) + sample(1:6, 1000, replace=TRUE)

# 绘制直方图
hist(dice_rolls, breaks=11, col="lightblue",main="Distribution of Sums of Two Dice Rolls",xlab="Sum", ylab="Frequency", border="black")

高阶函数

笔者发现R中的某些函数拥有类似Kotlin中高阶函数的性质,故暂且将它们称为“高阶函数”

  • apply(X, MARGIN, FUN):此函数接受一个数组或矩阵X,MARGIN接受1/2/c(1,2)表示对行/列/行和列执行FUN函数的操作,返回对象的副本
  • lapply(X, FUN):此函数最接近Kotlin中的apply函数,它接受一个向量或其他R对象,使用FUN函数处理后返回对象的副本组成的List(这与Kotlin不同,Kotlin中的apply函数返回对象本身)
  • sapply(X, FUN):此函数最接近Kotlin中的apply函数,它接受一个向量或其他R对象,使用FUN函数处理后返回对象的副本
  • tapply(X, INDEX, FUN):此函数将X按INDEX分组后,对每个组执行FUN

用户函数

在R中可定义用户函数,具体方法为

R 复制代码
函数名 <- function(形参表列) {
  以最后一条语句的返回值为函数返回值
}

例如

R 复制代码
mode_salary <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

是一个返回x中数据众数的函数,它使用unique对数据去重获得x中出现的每一个数字,随后使用match匹配ux中的每一个数字在x中的索引,使用tabulate统计其出现的次数,随后使用which.max返回ux中此项最大的数字,即x中出现次数最多的数字

游客

全部评论 (0)

暂无评论,快来抢沙发吧~