Fork me on GitHub

R语言

R语言

R 语言是为数学研究工作者设计的一种数学编程语言,主要用于统计分析、绘图、数据挖掘。R 语言与 C 语言都是贝尔实验室的研究成果,但两者有不同的侧重领域,R 语言是一种解释型的面向数学理论研究工作者的语言,而 C 语言是为计算机软件工程师设计的。


R 语言特点

  1. R 语言环境软件属于 GNU 开源软件,兼容性好、使用免费
  2. 语法十分有利于复杂的数学运算
  3. 数据类型丰富,包括向量、矩阵、因子、数据集等常用数据结构
  4. 代码风格好,可读性强

R语言环境安装

官网: https://cran.r-project.org/

brew install r

R交互式运行

image

Rscritp运行文件

使用Rscritp hello.R

myString <- "Hello, World!"

print( myString )

image

变量

R 语言的有效的变量名称由字母,数字以及点号 . 或下划线 _ 组成。变量名称以字母或点开头
建议使用下划线命名(snake_case)风格,兼容性好,可读性高,越来越主流。

  1. ✅ 推荐风格
命名风格 示例 说明
小写 + 下划线 total_sum ✅ R 社区最常见风格,清晰、易读,适合长期维护
小写 + 驼峰 totalSum 类似 JavaScript 命名风格,有一定接受度
点分命名(老派 R) total.sum 老式 R 风格,容易与隐藏变量混淆(如 .total),不推荐
全小写无分隔符 totalsum 不易阅读,变量越长越难以理解
全大写 TOTAL_SUM 常用于常量,但 R 并无真正“常量”语义,容易混淆
小写 + 数字尾缀 item1, item2 可用于循环生成变量,但不建议用于正式逻辑
随意拼音命名 mingzi, zongjia 不利于协作开发,影响跨语言可读性
单字符缩写 x, y, a 仅适用于非常短的临时脚本或数学公式,正式项目中应避免
  1. 🚫 不推荐做法
    • 使用类似 T, F, c, mean 等 R 内置函数/常量作为变量名,会引发预料外的问题。
    • 命名过短无意义(如 a, b1, xx2),调试时令人头大。
    • 使用拼音,除非是极短脚本或自己用(协作开发尽量英文)。

  2. 💡 命名建议
    • 名字要表达 意图:user_count 比 uc 清晰得多。
    • 计数类用 count、逻辑型用 is、列表用 _list。
    • 标量一般不用复数,集合/数组用复数名表示。

变量赋值

最新版本的 R 语言的赋值可以使用左箭头 <-、等号 = 、右箭头 -> 赋值:

场景 建议使用赋值符号
一般变量赋值 <-
函数参数赋值 =
特殊表达 / 可读性 ->(少用)

常用语法

输入输出

R 语言与 node.js 和 Python 一样,是解释型的语言,所以我们往往可以像使用命令行一样使用 R 语言。

R
#打印输出
print(123)
#需要输出结果的拼接
cat(1, "加", 1, "等于", 2, '\n')

输出内容到文件

cat()函数

#覆盖写入
cat("GOOGLE", file="/Users/yuqiu/Vscode_workspace/R/r_test.txt")
#追加写入
cat("GOOGLE", file="/Users/yuqiu/Vscode_workspace/R/r_test.txt", append=TRUE)

image

sink()

#控制台输出的文字直接输出到文件中,控制台将不会显示输出,开启时"覆盖写入"
sink("/Users/yuqiu/Vscode_workspace/R/r_testlog.txt")
#保留控制台的输出,开启时"覆盖写入"操作
sink("/Users/yuqiu/Vscode_workspace/R/r_testlog.txt", split=TRUE)
#取消输出到文件,调用无参数的 sink
sink()

文字输入

#从文件读入文字,所读取的文本文件每一行 (包括最后一行) 的结束必须有换行符,否则会报错。
readLines("/Users/yuqiu/Vscode_workspace/R/r_testlog.txt")

除了文字的简单输入输出以外,R 还提供了很多输入数据和输出数据的方法,R 语言最方便的地方就是可以将数据结构直接保存到文件中去,而且支持保存为 CSV、Excel 表格等形式,并且支持直接地读取。这对于数学研究者来说无疑是非常方便的。

工作目录

文件操作,需要设置文件的路径,R 语言可以通过以下两个函数来获取和设置当前的工作目录:
getwd() : 获取当前工作目录
setwd() : 设置当前工作目录

# 当前工作目录
print(getwd())
# 设置当前工作目录
setwd("/Users/yuqiu/Vscode_workspace/R")
# 查看当前工作目录
print(getwd())

image

注释

R 语言只支持单行注释,注释符号为 #;如果有多行注释只需要在每一行添加 # 号

#if(FALSE) 多行注释变通写法
if(FALSE) {
    "
    这是一个多行注释的实例
    注释内容放在单引号或双引号之间
    "
}

myString <- "Hello, World!"
print ( myString)

运算符

赋值、基本运算、关系运算、逻辑运算、数学函数、概率分布函数。

📝 赋值方式

R 支持三种赋值方式:

场景 推荐符号 示例 说明
一般变量赋值 <- x <- 10 最常见,也是 R 社区推荐的方式
函数参数赋值 = sum(x = 10) 仅用于函数参数传递
特殊场景/可读性 -> 10 -> x 不推荐,少用
a <- 123
b = 456
print(a + b)  # 输出: [1] 579

➕ 数学运算符

优先级 符号 含义
1 () 括号
2 ^ 幂运算
3 %%, %/% 取余、整除
4 *, / 乘法、除法
5 +, - 加法、减法
1 + 2 * 3        # [1] 7
(1 + 2) * 3      # [1] 9
3 %% 2^2         # [1] 3
10 / 3 %/% 2     # [1] 10

🔍 关系运算符

用于向量间逐元素比较,返回布尔向量。

运算符 说明
> 大于
< 小于
== 等于
!= 不等于
>= 大于等于
<= 小于等于
v <- c(2, 4, 6, 9)
t <- c(1, 4, 7, 9)
print(v > t)  # [1]  TRUE FALSE FALSE FALSE

⚙️ 逻辑运算符

运算符 说明
& 元素级 与
| 元素级 或
!
&& 仅判断首元素 与
|| 仅判断首元素 或
v <- c(3, 1, TRUE, 2+3i)
t <- c(4, 1, FALSE, 2+3i)
print(v & t)  # [1]  TRUE  TRUE FALSE  TRUE
print(!v)     # [1] FALSE FALSE FALSE FALSE

🧾 赋值运算符

运算符 方向 说明
<-, =, <<- 向左赋值
->, ->> 向右赋值
v1 <- c(1, 2)
1:2 -> v2
print(v1)  # [1] 1 2
print(v2)  # [1] 1 2

🧩 其他运算符

运算符 说明
: 创建整数序列
%in% 判断元素是否属于集合
%*% 矩阵乘法
1:5            # [1] 1 2 3 4 5
3 %in% 1:5     # [1] TRUE
M <- matrix(1:6, nrow=2)
M %*% t(M)     # 矩阵乘法

🧮 数学函数

函数 说明
sqrt(n) 平方根
exp(n) e 的 n 次幂
log(m, n) 对数(以 n 为底)
log10(m) 常用对数
sqrt(4)        # [1] 2
log(2, 4)      # [1] 0.5

📐 取整函数

函数 说明
round(n) 四舍五入
floor(n) 向下取整
ceiling(n) 向上取整
round(2.5)     # [1] 2
floor(2.9)     # [1] 2
ceiling(2.1)   # [1] 3

⚠️ 注意:R 的 round 实现偏向“偶数舍入”(即“银行家舍入”)。

📐 三角函数(弧度制)

sin(pi/6)      # [1] 0.5
cos(pi/4)      # [1] 0.7071068
tan(pi/3)      # [1] 1.732051
asin(0.5)      # [1] 0.5235988

🎲 概率分布函数

以正态分布为例:

函数前缀 功能
d 密度函数
p 分布函数
q 分位数函数
r 随机样本生成
dnorm(0)        # [1] 0.3989423
pnorm(0)        # [1] 0.5
qnorm(0.95)     # [1] 1.644854
rnorm(3, 5, 2)  # 生成 3 个均值 5、标准差 2 的正态分布随机数

R 还支持 pois(泊松)、binom(二项式)等其他分布,推荐进阶查阅《概率论与数理统计》。

数据类型

基本数据类型,R 的三种基础数据类型如下:
• 数字型(numeric)
• 逻辑型(logical)
• 字符型(character)

# 数字一般型
123
-0.125
# 数字型科学计数法
1.23e2
-1.25E-1

# 逻辑型:区分大小写,true、True 是非法的
TRUE
FALSE

#字符串可由单引号或双引号包围
'runoob' == "runoob"  # [1] TRUE

#变量的定义:R 是弱类型语言,变量无需声明类型,赋值即定义
a = 1
b <- TRUE
c = "abc"

对象类型(复杂结构)

R 中更高层次的数据结构主要包括:
• 向量(vector)
• 列表(list)
• 矩阵(matrix)
• 数组(array)
• 因子(factor)
• 数据框(data.frame)

字符串操作

toupper("Autumn")       # "AUTUMN"
tolower("Autumn")       # "autumn"
#注意中文在不同编码下的字节数不同(GBK 是 2,UTF-8 是 3)。
nchar("中文", type="bytes")  # 4
nchar("中文", type="char")   # 2
#截取字符串
substr("123456", 1, 3)  # "123"
substring("123456", 4)  # "456"
as.numeric("12")        # 12
as.character(12.34)     # "12.34"
#字符串拆分
strsplit("2019;10;1", ";")  # [[1]] "2019" "10" "1"
#字符串替换
gsub("/", "-", "2019/10/1") # "2019-10-1"
#支持 Perl 风格正则
gsub("[[:alpha:]]+", "$", "Two words")  # "$ $"

paste() 函数用于使用指定对分隔符来对字符串进行连接,默认的分隔符为空格。
paste(..., sep = " ", collapse = NULL)
... : 字符串列表
sep : 分隔符,默认为空格
collapse : 两个或者更多字符串对象根据元素对应关系拼接到一起,在字符串进行连接后,再使用 collapse 指定对连接符进行连接

a <- "Google"
b <- 'Baidu'
c <- "Taobao"

print(paste(a,b,c))
print(paste(a,b,c, sep = "-"))
print(paste(letters[1:6],1:6, sep = "", collapse = "="))
paste(letters[1:6],1:6, collapse = ".")

[1] "Google Baidu Taobao"
[1] "Google-Baidu-Taobao"
[1] "a1=b2=c3=d4=e5=f6"
[1] "a 1.b 2.c 3.d 4.e 5.f 6"

format()函数用于格式化字符串,format()可作用于字符串或数字。
format(x, digits, nsmall, scientific, width, justify = c("left", "right", "centre", "none"))
x : 输入对向量
digits : 显示的位数
nsmall : 小数点右边显示的最少位数
scientific : 设置科学计数法
width : 通过开头填充空白来显示最小的宽度
justify:设置位置,显示可以是左边、右边、中间等。

# 显示 9 位,最后一位四舍五入
result <- format(23.123456789, digits = 9)
print(result)

# 使用科学计数法显示
result <- format(c(6, 13.14521), scientific = TRUE)
print(result)

# 小数点右边最小显示 5 位,没有的以 0 补充
result <- format(23.47, nsmall = 5)
print(result)

# 将数字转为字符串
result <- format(6)
print(result)

# 宽度为 6 位,不够的在开头添加空格
result <- format(13.7, width = 6)
print(result)

# 左对齐字符串
result <- format("Baidu", width = 9, justify = "l")
print(result)

# 居中显示
result <- format("Baidu", width = 10, justify = "c")
print(result)

[1] "23.1234568"
[1] "6.000000e+00" "1.314521e+01"
[1] "23.47000"
[1] "6"
[1] "  13.7"
[1] "Baidu   "
[1] "  Baidu  "

向量(vector)

#创建向量
a = c(3, 4)
b = c(5, 0)
a + b  # [1] 8 4

#索引访问,注意:下标从 1 开始!
a = c(10, 20, 30, 40, 50)
a[2]             # [1] 20
a[1:4]           # [1] 10 20 30 40
a[c(1, 3, 5)]    # [1] 10 30 50
a[c(-1, -5)]     # [1] 20 30 40

#向量运算,常见数学函数也适用于向量:sqrt、exp、log
c(1.1, 1.2, 1.3) - 0.5    # [1] 0.6 0.7 0.8
a = c(1, 2)
a ^ 2                     # [1] 1 4

#向量排序和统计
a = c(1, 3, 5, 2, 4, 6)
sort(a)          # 升序
rev(a)           # 反转
order(a)         # 返回排序后的下标
a[order(a)]      # 排序后的向量
sum(1:5)         # 15
mean(1:5)        # 3
sd(1:5)          # 1.581139
range(1:5)       # [1] 1 5

#向量生成
1:10
seq(1, 9, 2)            # [1] 1 3 5 7 9
seq(0, 1, length.out=3) # [1] 0.0 0.5 1.0
rep(0, 5)               # [1] 0 0 0 0 0

#NA 与 NULL 的区别  NA:缺失值,占位; NULL:不存在,不占位置。
length(c(NA, NA, NULL))    # [1] 2
c(NA, NA, NULL, NA)        # [1] NA NA NA

逻辑型向量与操作

a = c(11, 12, 13)
b = a > 12                # [1] FALSE FALSE TRUE
which(b)                  # [1] 3

vector = c(10, 40, 78, 64, 53, 62, 69, 70)
vector[which(vector >= 60 & vector < 70)]  # [1] 64 62 69

#all() 与 any()
all(c(TRUE, TRUE))      # TRUE
any(c(FALSE, TRUE))     # TRUE

矩阵(matrix)

#创建矩阵
vector = c(1, 2, 3, 4, 5, 6)
matrix(vector, 2, 3)  # 默认按列填充
matrix(vector, 2, 3, byrow=TRUE)  # 按行填充

#访问元素
m1[1, 1]   # 第一行第一列
m1[1, 3]   # 第一行第三列

#设置行列名
colnames(m1) = c("x", "y", "z")
rownames(m1) = c("a", "b")
m1["a", ]

#矩阵运算
m1 = matrix(c(1, 2), 1, 2)
m2 = matrix(c(3, 4), 2, 1)
m1 %*% m2  # 矩阵乘法

A = matrix(c(1, 3, 2, 4), 2, 2)
solve(A)   # 求逆矩阵

#apply 函数
A = matrix(c(1, 3, 2, 4), 2, 2)
apply(A, 1, sum)  # 按行求和
apply(A, 2, sum)  # 按列求和

R 语言中的判断语句(条件语句)

条件判断的核心是:根据布尔表达式的结果执行相应代码块。
R 支持以下几种判断语句:
• if 语句
• if...else 语句
• if...else if...else 多分支结构
• switch 语句(适用于多值匹配)

#if 语句
x <- 50L
if (is.integer(x)) {
   print("X 是一个整数")
}
# 输出:
# [1] "X 是一个整数"

#if…else 语句
x <- c("google", "baidu", "taobao")
if ("baidu" %in% x) {
   print("包含 baidu")
} else {
   print("不包含 baidu")
}
# 输出:
# [1] "包含 baidu"

#if…else if…else 多分支结构
x <- c("google", "runoob", "taobao")
if ("weibo" %in% x) {
   print("第一个 if 包含 weibo")
} else if ("runoob" %in% x) {
   print("第二个 if 包含 runoob")
} else {
   print("没有找到")
}
# 输出:
# [1] "第二个 if 包含 runoob"

#switch 语句
#使用整数匹配:整数表示返回第几个 case 值;超出范围返回 NULL。
x <- switch(
   3,
   "google",
   "baidu",
   "taobao",
   "weibo"
)
print(x)
# 输出:
# [1] "taobao"

#使用字符串匹配,字符串则根据名字匹配对应的 case
you.like <- "baidu"
switch(you.like,
       google = "www.google.com",
       baidu = "www.baidu.com",
       taobao = "www.taobao.com")
# 输出:
# [1] "www.baidu.com"

#匹配失败返回 NULL
x <- switch(4, "google", "baidu", "taobao")
print(x)
# 输出:
# NULL

循环

R 语言提供的循环类型有:
repeat 循环
while 循环
for 循环

R 语言提供的循环控制语句有:
break 语句
Next 语句

#repeat
repeat {
    # 相关代码
    if(condition) {
       break
    }
}

#while
while(condition)
{
   statement(s);
}

#for
for (value in vector) {
    statements
}

函数

函数是 R 中的核心构建块,用于封装代码逻辑、提高复用性。R 提供了大量内置函数,也允许用户定义自己的函数。

#函数的基本结构
function_name <- function(arg1, arg2, ...) {
    # 函数体
    return(输出结果)
}

#加法函数
add_numbers <- function(x, y) {
  result <- x + y
  return(result)
}
sum_result <- add_numbers(3, 4)
print(sum_result)  # 输出:7

#不带参数的函数
new.function <- function() {
    for(i in 1:5) {
        print(i^2)
    }
}
new.function()
# 输出:1, 4, 9, 16, 25

#带参数
new.function <- function(a, b, c) {
  result <- a * b + c
  print(result)
}
new.function(5, 3, 11)               # 输出:26
new.function(a = 11, b = 5, c = 3)   # 输出:58

#设置默认参数值
new.function <- function(a = 3, b = 6) {
  result <- a * b
  print(result)
}
new.function()      # 输出:18
new.function(9, 5)  # 输出:45

#懒惰计算(Lazy Evaluation)
# R 会延迟对参数的求值,直到真正用到它:
new.function <- function(a, b) {
  print(a^2)
  print(b)  # 未传参会报错
}
new.function(6)
# 输出:
# 36
# Error in print(b): 缺少参数"b"

内置函数

#sum():求和
x <- c(1, 2, 3, 4, 5)
sum(x)  # 输出:15

#mean():求平均值
mean(25:82)  # 输出:53.5

#seq():生成序列
seq(32, 44)  # 输出:32 33 34 ... 44

#paste():字符串拼接
paste("Hello", "World")  # 输出:"Hello World"

#length():元素个数
length(c(1, 2, 3))  # 输出:3

#str():结构查看
x <- c(1, 2, 3, 4, 5)
str(x)
# 输出:num [1:5] 1 2 3 4 5

#矩阵支持
matrix <- matrix(1:9, nrow = 3)
sum(matrix)    # 输出:45
mean(matrix)   # 输出:5
length(matrix) # 输出:9
str(matrix)
# 输出:int [1:3, 1:3] 1 2 3 4 5 6 7 8 9

列表

列表是 R 语言的对象集合,可以用来保存不同类型的数据,可以是数字、字符串、向量、另一个列表、矩阵、数据框等,还可以包含矩阵和函数。
列表是一种灵活的数据结构,可以存储和操作多种类型的数据对象。

#list() 函数创建列表,包含了字符串、向量和数字
list_data <- list("baidu", "google", c(11,22,33), 123, 51.23, 119.1)
print(list_data)

#使用 c() 函数来创建列表,也可以使用该函数将多个对象合并为一个列表
my_list <- c(object1, object2, object3)

# 列表包含向量、矩阵、列表
list_data <- list(c("Google","Baidu","Taobao"), matrix(c(1,2,3,4,5,6), nrow = 2),
   list("baidu",12.3))
# 给列表元素设置名字
names(list_data) <- c("Sites", "Numbers", "Lists")
# 显示列表
print(list_data)

# 显示第一个列表
print(list_data[1])
# 访问列表的第三个元素
print(list_data[3])
# 访问第一个向量元素
print(list_data$Numbers)

#操作列表元素
# 添加元素
list_data[4] <- "新元素"
print(list_data[4])
# 删除元素
list_data[4] <- NULL
# 删除后输出为 NULL
print(list_data[4])
# 更新元素
list_data[3] <- "我替换来第三个元素"
print(list_data[3])

# 循环
# 创建一个包含数字和字符的列表
my_list <- list(1, 2, 3, "a", "b", "c")
# 使用 for 循环遍历列表中的每个元素
for (element in my_list) {
  print(element)
}

# 合并
# 创建两个列表
list1 <- list(1,2,3)
list2 <- list("Google","Runoob","Taobao")
# 合并列表
merged.list <- c(list1,list2)
# 显示合并后的列表
print(merged.list)

#列表转换为向量
# 创建列表
list1 <- list(1:5)
print(list1)
list2 <-list(10:14)
print(list2)
# 转换为向量
v1 <- unlist(list1)
v2 <- unlist(list2)
print(v1)
print(v2)
# 两个向量相加
result <- v1+v2
print(result)

总结
R 语言列表操作和函数:
创建列表:
使用 c() 函数:例如,list1 <- c(1, 2, 3) 创建一个包含 1、2 和 3 的列表。
使用 list() 函数:例如,list2 <- list(1, "a", TRUE) 创建一个包含不同类型元素的列表。

访问列表元素:
使用索引:通过索引访问列表中的元素。例如,list1[1] 返回列表中的第一个元素。
使用元素名称:如果列表中的元素有名称,可以使用名称来访问它们。例如,list3 <- list(a = 1, b = 2) 可以通过 list3$a 和 list3$b 来访问元素。

列表操作:
长度:使用 length() 函数获取列表的长度。例如,length(list1) 返回列表 list1 的长度。
合并:使用 c() 函数或 append() 函数将两个或多个列表合并为一个列表。例如,list4 <- c(list1, list2) 合并列表 list1 和 list2。
增加元素:使用 c() 函数将元素添加到现有列表中。例如,list1 <- c(list1, 4) 将 4 添加到列表 list1 的末尾。
删除元素:使用索引和负索引操作符 - 删除列表中的元素。例如,list1 <- list1[-2] 删除列表 list1 中的第二个元素。

列表循环:
for 循环:使用 for 循环遍历列表中的元素。例如,for (element in list1) { ... } 遍历列表 list1 中的每个元素。
lapply() 函数:将一个函数应用于列表中的每个元素,并返回结果列表。例如,new_list <- lapply(list1, function(x) x * 2) 将列表 list1 中的每个元素乘以 2。

矩阵

R 语言为线性代数的研究提供了矩阵类型,这种数据结构很类似于其它语言中的二维数组,但 R 提供了语言级的矩阵运算支持。
矩阵里的元素可以是数字、符号或数学式。
一个 M x N 的矩阵是一个由 M(row) 行 和 N 列(column)元素排列成的矩形阵列。
image
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,dimnames = NULL)
参数说明:
data 向量,矩阵的数据
nrow 行数
ncol 列数
byrow 逻辑值,为 FALSE 按列排列,为 TRUE 按行排列
dimname 设置行和列的名称


# 创建矩阵
# byrow 为 TRUE 元素按行排列
M <- matrix(c(3:14), nrow = 4, byrow = TRUE)
print(M)
# Ebyrow 为 FALSE 元素按列排列
N <- matrix(c(3:14), nrow = 4, byrow = FALSE)
print(N)
# 定义行和列的名称
rownames = c("row1", "row2", "row3", "row4")
colnames = c("col1", "col2", "col3")
P <- matrix(c(3:14), nrow = 4, byrow = TRUE, dimnames = list(rownames, colnames))
print(P)

#转置矩阵
#R 语言矩阵提供了 t() 函数,可以实现矩阵的行列互换。例如有个 m 行 n 列的矩阵,使用 t() 函数就能转换为 n 行 m 列的矩阵
# 创建一个 2 行 3 列的矩阵
M = matrix( c(2,6,5,1,10,4), nrow = 2,ncol = 3,byrow = TRUE)
print(M)
# 转换为 3 行 2 列的矩阵
print(t(M))
     [,1] [,2] [,3]
[1,]    2    6    5
[2,]    1   10    4
[1] "-----转换-----"
     [,1] [,2]
[1,]    2    1
[2,]    6   10
[3,]    5    4

#访问矩阵元素
# 定义行和列的名称
rownames = c("row1", "row2", "row3", "row4")
colnames = c("col1", "col2", "col3")
# 创建矩阵
P <- matrix(c(3:14), nrow = 4, byrow = TRUE, dimnames = list(rownames, colnames))
print(P)
# 获取第一行第三列的元素
print(P[1,3])
# 获取第四行第二列的元素
print(P[4,2])
# 获取第二行
print(P[2,])
# 获取第三列
print(P[,3])

#矩阵计算
# 创建 2 行 3 列的矩阵
matrix1 <- matrix(c(7, 9, -1, 4, 2, 3), nrow = 2)
print(matrix1)
matrix2 <- matrix(c(6, 1, 0, 9, 3, 2), nrow = 2)
print(matrix2)

# 两个矩阵相加
result <- matrix1 + matrix2
cat("相加结果:","\n")
print(result)
# 两个矩阵相减
result <- matrix1 - matrix2
cat("相减结果:","\n")
print(result)

# 两个矩阵相乘
result <- matrix1 * matrix2
cat("相乘结果:","\n")
print(result)

# 两个矩阵相除
result <- matrix1 / matrix2
cat("相除结果:","\n")
print(result)

数组

数组也是 R 语言的对象,R 语言可以创建一维或多维数组。
R 语言数组是一个同一类型的集合,前面我们学的矩阵 matrix 其实就是一个二维数组。
向量、矩阵、数组关系可以看下图:
image

array(data = NA, dim = length(data), dimnames = NULL)

参数说明:
data - 指定数组的数据源,可以是一个向量、矩阵或列表。
dim - 指定数组的维度,可以是一个整数向量或一个表示维度的元组,默认是一维数组。例如,dim = c(2, 3, 4) 表示创建一个 2x3x4 的三维数组。
dimnames - 可选参数,用于指定数组每个维度的名称,可以是一个包含维度名称的列表。


#array函数使用向量创建一维数组
my_vector <- c(1, 2, 3, 4)
my_array <- array(my_vector, dim = c(4))
print(my_array)

vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)
# 创建三维数组
result <- array(c(vector1,vector2),dim = c(3,3,2))
print(result)
, , 1

     [,1] [,2] [,3]
[1,]    5   10   13
[2,]    9   11   14
[3,]    3   12   15

, , 2

     [,1] [,2] [,3]
[1,]    5   10   13
[2,]    9   11   14
[3,]    3   12   15

#使用 dimnames 参数来设置各个维度的名称
# 创建两个不同长度的向量
vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)
column.names <- c("COL1","COL2","COL3")
row.names <- c("ROW1","ROW2","ROW3")
matrix.names <- c("Matrix1","Matrix2")
# 创建数组,并设置各个维度的名称
result <- array(c(vector1,vector2),dim = c(3,3,2),dimnames = list(row.names,column.names,matrix.names))
print(result)
, , Matrix1

     COL1 COL2 COL3
ROW1    5   10   13
ROW2    9   11   14
ROW3    3   12   15

, , Matrix2

     COL1 COL2 COL3
ROW1    5   10   13
ROW2    9   11   14
ROW3    3   12   15

#访问数组元素
my_array <- array(1:12, dim = c(2, 3, 2))  # 创建一个3维数组
element <- my_array[1, 2, 1]  # 访问第一个维度为1,第二个维度为2,第三个维度为1的元素
print(element)
elements <- my_array[c(1, 2), c(2, 3), c(1, 2)]  # 访问多个元素,其中每个维度的索引分别为1和2
print(element)
# 创建两个不同长度的向量
vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)
column.names <- c("COL1","COL2","COL3")
row.names <- c("ROW1","ROW2","ROW3")
matrix.names <- c("Matrix1","Matrix2")
# 创建数组
result <- array(c(vector1,vector2),dim = c(3,3,2),dimnames = list(row.names, column.names, matrix.names))
# 显示数组第二个矩阵中第三行的元素
print(result[3,,2])
# 显示数组第一个矩阵中第一行第三列的元素
print(result[1,3,1])
# 输出第二个矩阵
print(result[,,2])


# 创建两个不同长度的向量
vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)
# 创建数组
array1 <- array(c(vector1,vector2),dim = c(3,3,2))
# 创建两个不同长度的向量
vector3 <- c(9,1,0)
vector4 <- c(6,0,11,3,14,1,2,6,9)
array2 <- array(c(vector3,vector4),dim = c(3,3,2))
# 从数组中创建矩阵
matrix1 <- array1[,,2]
matrix2 <- array2[,,2]
# 矩阵相加
result <- matrix1+matrix2
print(result)

# apply() 元素对数组元素进行跨维度计算
参数说明:
X:要应用函数的数组或矩阵。
MARGIN:指定应用函数的维度,可以是1表示行,2表示列,或者c(1, 2)表示同时应用于行和列。
FUN:要应用的函数,可以是内置函数(如mean、sum等)或自定义函数。
...:可选参数,用于传递给函数的其他参数。
# 创建两个不同长度的向量
vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)
# 创建数组
new.array <- array(c(vector1,vector2),dim = c(3,3,2))
print(new.array)
# 计算数组中所有矩阵第一行的数字之和
result <- apply(new.array, c(1), sum)
print(result)

因子

因子用于存储不同类别的数据类型,例如人的性别。
factor(x = character(), levels, labels = levels,
exclude = NA, ordered = is.ordered(x), nmax = NA)
参数说明:
x:向量。
levels:指定各水平值, 不指定时由x的不同值来求得。
labels:水平的标签, 不指定时用各水平值的对应字符串。
exclude:排除的字符。
ordered:逻辑值,用于指定水平是否有序。
nmax:水平的上限数量。

x <- c("男", "女", "男", "男",  "女")
sex <- factor(x)
print(sex)
print(is.factor(sex))
# 
x <- c("男", "女", "男", "男",  "女",levels=c('男','女'))
sex <- factor(x)
print(sex)
print(is.factor(sex))
# 因子水平标签
sex=factor(c('f','m','f','f','m'),levels=c('f','m'),labels=c('female','male'),ordered=TRUE)
print(sex)

#生成因子水平gl(n, k, length = n*k, labels = seq_len(n), ordered = FALSE)
v <- gl(3, 4, labels = c("Google", "Baidu","Taobao"))
print(v)

R数据框

数据框(Data frame)可以理解成常说的"表格"。数据框是 R 语言的数据结构,是特殊的二维列表。
数据框每一列都有一个唯一的列名,长度都是相等的,同一列的数据类型需要一致,不同列的数据类型可以不一样。
image
data.frame(…, row.names = NULL, check.rows = FALSE,
check.names = TRUE, fix.empty.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
…: 列向量,可以是任何类型(字符型、数值型、逻辑型),一般以 tag = value 的形式表示,也可以是 value。
row.names: 行名,默认为 NULL,可以设置为单个数字、字符串或字符串和数字的向量。
check.rows: 检测行的名称和长度是否一致。
check.names: 检测数据框的变量名是否合法。
fix.empty.names: 设置未命名的参数是否自动设置名字。
stringsAsFactors: 布尔值,字符是否转换为因子,factory-fresh 的默认值是 TRUE,可以通过设置选项(stringsAsFactors=FALSE)来修改。

table = data.frame(
    姓名 = c("张三", "李四"),
    工号 = c("001","002"),
    月薪 = c(1000, 2000)
)
print(table) # 查看 table 数据
# 获取数据结构
str(table)
# 显示概要
print(summary(table))

# 提取指定的列
result <- data.frame(table$姓名,table$月薪)
print(result)

# 提取前面两行
print("---输出前面两行----")
result <- table[1:2,]
print(result)

# 读取第 2 、3 行的第 1 、2 列数据:
result <- table[c(2,3),c(1,2)]
print(result)

# 添加部门列
table$部门 <- c("运营","技术","编辑")
print(table)

cbind() 函数将多个向量合成一个数据框(合并列),rbind(合并行)

# 创建向量
sites <- c("Google","Runoob","Taobao")
likes <- c(222,111,123)
url <- c("www.google.com","www.runoob.com","www.taobao.com")
# 将向量组合成数据框
addresses <- cbind(sites,likes,url)
# 查看数据框
print(addresses)

#对两个数据框进行合并可以使用 rbind() 函数
table = data.frame(
    姓名 = c("张三", "李四","王五"),
    工号 = c("001","002","003"),
    月薪 = c(1000, 2000,3000)
)
newtable = data.frame(
    姓名 = c("小明", "小白"),
    工号 = c("101","102"),
    月薪 = c(5000, 7000)
)
# 合并两个数据框
result <- rbind(table,newtable)
print(result)

数据重塑

merge() 函数和 SQL 的 JOIN 功能很相似
merge(x, y, …)

merge(x, y, by = intersect(names(x), names(y)),
by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
sort = TRUE, suffixes = c(".x",".y"), no.dups = TRUE,
incomparables = NULL, …)
常用参数说明:
x, y: 数据框
by, by.x, by.y:指定两个数据框中匹配列名称,默认情况下使用两个数据框中相同列名称。
all:逻辑值; all = L 是 all.x = L 和 all.y = L 的简写,L 可以是 TRUE 或 FALSE。
all.x:逻辑值,默认为 FALSE。如果为 TRUE, 显示 x 中匹配的行,即便 y 中没有对应匹配的行,y 中没有匹配的行用 NA 来表示。
all.y:逻辑值,默认为 FALSE。如果为 TRUE, 显示 y 中匹配的行,即便 x 中没有对应匹配的行,x 中没有匹配的行用 NA 来表示。
sort:逻辑值,是否对列进行排序。

# data frame 1
df1 = data.frame(SiteId = c(1:6), Site = c("Google","Runoob","Taobao","Facebook","Zhihu","Weibo"))


# data frame 2
df2 = data.frame(SiteId = c(2, 4, 6, 7, 8), Country = c("CN","USA","CN","USA","IN")) 

# INNER JOIN 
df1 = merge(x=df1,y=df2,by="SiteId")
print("----- INNER JOIN -----")
print(df1)

# FULL JOIN
df2 = merge(x=df1,y=df2,by="SiteId",all=TRUE)
print("----- FULL JOIN -----")
print(df2)

# LEFT JOIN
df3 = merge(x=df1,y=df2,by="SiteId",all.x=TRUE)
print("----- LEFT JOIN -----")
print(df3)

# RIGHT JOIN
df4 = merge(x=df1,y=df2,by="SiteId",all.y=TRUE)
print("----- RIGHT JOIN -----")
print(df4)

R 语言使用 melt() 和 cast() 函数来对数据进行整合和拆分。
melt() :宽格式数据转化成长格式。
cast() :长格式数据转化成宽格式。

R 包

包是 R 函数、实例数据、预编译代码的集合,包括 R 程序,注释文档、实例、测试数据等。

#查看 R 包的安装目录
.libPaths()
#查看已安装的包
library()
#查看已载入的包
search()
#安装新包
install.packages("要安装的包名")

# 使用镜像仓库安装 XML 包
install.packages("XML", repos = "https://mirrors.ustc.edu.cn/CRAN/")
#配置仓库url, 编辑.Rprofile文件
options("repos" = c(CRAN="https://mirrors.tuna.tsinghua.edu.cn/CRAN/"))

#使用包
library("XML")

Excel文件

#安装
install.packages("xlsx", repos = "https://mirrors.ustc.edu.cn/CRAN/")
# 验证包是否安装
any(grepl("xlsx",installed.packages()))
# 载入包
library("xlsx")
library("xlsx")

# 读取 sites.xlsx 第一个工作表数据
data <- read.xlsx("sites.xlsx", sheetIndex = 1)
print(data)

XML文件

#安装XML
install.packages("XML", repos = "https://mirrors.ustc.edu.cn/CRAN/")
#查看是否安装成功
any(grepl("XML",installed.packages()))
# 载入 XML 包
library("XML")
# 设置文件名
result <- xmlParse(file = "sites.xml")
# 输出结果
print(result)

# 提取根节点
rootnode <- xmlRoot(result)
# 统计数据量
rootsize <- xmlSize(rootnode)
# 输出结果
print(rootsize)

# 查看第 2 个节点数据
print(rootnode[2])
# 查看第 2 个节点的第  1 个数据
print(rootnode[[2]][[1]])
# 查看第 2 个节点的第 3 个数据
print(rootnode[[2]][[3]])

# 转为列表
xml_data <- xmlToList(result)
print(xml_data)
print("============================")
# 输出第一行第二列的数据
print(xml_data[[1]][[2]])

# xml 文件数据转为数据框
xmldataframe <- xmlToDataFrame("sites.xml")
print(xmldataframe)

JSON文件

#安装Json
install.packages("rjson", repos = "https://mirrors.ustc.edu.cn/CRAN/")
#检查
any(grepl("rjson",installed.packages()))

# 载入 rjson 包
library("rjson")

# 获取 json 数据
result <- fromJSON(file = "sites.json")
# 输出结果
print(result)
print("===============")
# 输出第 1 列的结果
print(result[1])
print("===============")
# 输出第 2 行第 2 列的结果
print(result[[2]][[2]])

# 转为数据框
json_data_frame <- as.data.frame(result)
print(json_data_frame)

MySQL

#安装Mysql
install.packages("RMySQL", repos = "https://mirrors.ustc.edu.cn/CRAN/")
#或者安装MariaDB
install.packages("RMariaDB", repos = "https://mirrors.ustc.edu.cn/CRAN/")
#检查是否安装
any(grepl("RMySQL",installed.packages()))

library(RMySQL)
# 连接mysql
mysqlconnection = dbConnect(MySQL(), user = 'root', password = '', dbname = 'test',host = 'localhost')
# 查看数据表
dbListTables(mysqlconnection)

# 查询 sites 表,增删改查操作可以通过第二个参数的 SQL 语句来实现
result = dbSendQuery(mysqlconnection, "select * from sites")
# 获取前面两行数据
data.frame = fetch(result, n = 2)
print(data.frame)

绘图

曲线图

curve(expr, from = NULL, to = NULL, n = 101, add = FALSE,
      type = "l", xname = "x", xlab = xname, ylab = NULL,
      log = NULL, xlim = NULL, …)

# S3 函数的方法
plot(x, y = 0, to = 1, from = y, xlim = NULL, ylab = NULL, …)

柱状图

barplot(H,xlab,ylab,main, names.arg,col,beside)

参数说明:
H 向量或矩阵,包含图表用的数字值,每个数值表示矩形条的高度。
xlab x 轴标签。
ylab y 轴标签。
main 图表标题。
names.arg 每个矩形条的名称。
col 每个矩形条的颜色。

# 设置文件名,输出为 png
png(file = "bar-1.png")

cvd19 = c(83534,2640626,585493)

barplot(cvd19,
    main="条形图",
    col=c("#ED1C24","#22B14C","#FFC90E"),
    names.arg=c("中国","美国","印度"),
    family='GB1'
)

饼状图

pie(x, labels = names(x), edges = 200, radius = 0.8,
clockwise = FALSE, init.angle = if(clockwise) 90 else 0,
density = NULL, angle = 45, col = NULL, border = NULL,
lty = NULL, main = NULL, …)
x: 数值向量,表示每个扇形的面积。
labels: 字符型向量,表示各扇形面积标签。
edges: 这个参数用处不大,指的是多边形的边数(圆的轮廓类似很多边的多边形)。
radius: 饼图的半径。
main: 饼图的标题。
clockwise: 是一个逻辑值,用来指示饼图各个切片是否按顺时针做出分割。
angle: 设置底纹的斜率。
density: 底纹的密度。默认值为 NULL。
col: 是表示每个扇形的颜色,相当于调色板。

# 数据准备
info = c(1, 2, 4, 8)
# 命名
names = c("Google", "Baidu", "Taobao", "Weibo")
# 涂色(可选)
cols = c("#ED1C24","#22B14C","#FFC90E","#3f48CC")
# 绘图
pie(info, labels=names, col=cols)

3D饼图

#安装plotrix
install.packages("plotrix", repos = "https://mirrors.ustc.edu.cn/CRAN/")

# 载入 plotrix
library(plotrix)
# 数据准备
info = c(1, 2, 4, 8)
# 命名
names = c("Google", "Baidu", "Taobao", "Weibo")
# 涂色(可选)
cols = c("#ED1C24","#22B14C","#FFC90E","#3f48CC")
# 设置文件名,输出为 png
png(file = "3d_pie_chart.png")
# 绘制 3D 图,family 要设置你系统支持的中文字体库
pie3D(info,labels = names,explode = 0.1, main = "3D 图",family = "STHeitiTC-Light")
posted @ 2025-05-16 14:42  秋夜雨巷  阅读(65)  评论(0)    收藏  举报