1.R语言和python语言差不多,例如print()和·注释方式等,但是有一些细节需要注意
2.数据类型
1)按对象类型来分是以下 6 种(后面会详细介绍这几种类型):
- 向量
- 列表
- 矩阵
- 数组
- 因子
- 数据框
2)向量
R 语言中向量作为一种类型存在可以让向量的操作变得更加容易:
> a = c(3, 4)
> b = c(5, 0)
> a + b
[1] 8 4
>
c() 是一个创造向量的函数。
这里把两个二维向量相加,得到一个新的二维向量 (8, 4)。如果将一个二维向量和三维向量做运算,将失去数学意义,虽然不会停止运行,但会被警告。
向量中的每一个元素可以通过下标单独取出,但需要注意的是:R 语言中的"下标"不代表偏移量,而代表第几个,也就是说是从 1 开始的!
> a[1:4] # 取出第 1 到 4 项,包含第 1 和第 4 项
[1] 10 20 30 40
> a[c(1, 3, 5)] # 取出第 1, 3, 5 项
[1] 10 30 50
> a[c(-1, -5)] # 去掉第 1 和第 5 项
[1] 20 30 40
这里和python就很不相同
一些常用方法
> toupper("Runoob") # 转换为大写
[1] "RUNOOB"
> tolower("Runoob") # 转换为小写
[1] "runoob"
> nchar("中文", type="bytes") # 统计字节长度
[1] 4
> nchar("中文", type="char") # 总计字符数量
[1] 2
> substr("123456789", 1, 5) # 截取字符串,从 1 到 5
[1] "12345"
> substring("1234567890", 5) # 截取字符串,从 5 到结束
[1] "567890"
> as.numeric("12") # 将字符串转换为数字
[1] 12
> as.character(12.34) # 将数字转换为字符串
[1] "12.34"
> strsplit("2019;10;1", ";") # 分隔符拆分字符串
[[1]]
[1] "2019" "10" "1"
> gsub("/", "-", "2019/10/1") # 替换字符串
[1] "2019-10-1"
3)矩阵
R 语言为线性代数的研究提供了矩阵类型,这种数据结构很类似于其它语言中的二维数组,但 R 提供了语言级的矩阵运算支持。
> vector=c(1, 2, 3, 4, 5, 6)
> matrix(vector, 2, 3)
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
solve()
函数主要用于求解线性方程组或计算矩阵的逆。
apply() 函数可以将矩阵的每一行或每一列当作向量来进行操作
> (A = matrix(c(1, 3, 2, 4), 2, 2))
[,1] [,2]
[1,] 1 2
[2,] 3 4
> apply(A, 1, sum) # 第二个参数为 1 按行操作,用 sum() 函数
[1] 3 7
> apply(A, 2, sum) # 第二个参数为 2 按列操作
[1] 4 6
3.判断和python一样,if,else if,else,多了个switch(),<-
是 赋值运算符(assignment operator),用于将右侧的值赋给左侧的变量。
x <- switch(
3, # 选择索引 3
"google",
"runoob",
"taobao",
"weibo"
)
print(x) # 输出 "taobao"
4.for循环和while循环对比
1)
语言 | 遍历方式 | 是否支持索引 | 迭代对象 |
---|
|------------|--------------|-----------------------|------------------|
| Python | for ... in
| 需要 enumerate()
获取索引 | 列表、元组、字典、字符串、范围等 |
|-------|--------------------|--------------|-------------|
| R | for (var in vec)
| 直接遍历值(不提供索引) | 主要遍历 向量 |
2)Python 和 R 语言都支持跳出循环 (break
) 和跳过当前循环 (continue
in Python, next
in R)。
3)R 语言有 repeat
循环,而 Python 没有,但 while True
可以实现类似功能。
repeat 循环会一直执行代码,直到条件语句为 true 时才退出循环,退出要使用到 break 语句。
语法格式如下:
repeat {
// 相关代码
if(condition) {
break
}
}
v <- c("Google","Runoob")
cnt <- 2
repeat {
print(v)
cnt <- cnt+1
if(cnt > 5) {
break
}
}
5.R函数
也是function
function_name <- function(arg_1, arg_2, ...) {
# 函数体
# 执行的代码块
return(output)
}
# 定义一个加法函数
add_numbers <- function(x, y) {
result <- x + y
return(result)
}
# 调用函数
sum_result <- add_numbers(3, 4)
print(sum_result) # 输出 7
6.字符串
特性 | Python | R 语言 |
---|
|--------|-----------------------|-------------------|
| 单引号字符串 | 可以包含双引号,不能直接包含单引号,需转义 | 不能包含单引号,包含双引号无须转义 |
|--------|-----------------------|-------------------|
| 双引号字符串 | 可以包含单引号,不能直接包含双引号,需转义 | 不能包含双引号,包含单引号无须转义 |
|-------|------------------------|-------------------------------|
| 多行字符串 | 可以使用三引号('''
或 """
) | 使用 cat()
或换行符 \n
来处理多行字符串 |
format() 函数用于格式化字符串,format() 可作用于字符串或数字。
# 显示 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("Runoob", width = 9, justify = "l")
print(result)
# 居中显示
result <- format("Runoob", width = 10, justify = "c")
print(result)
7.列表
# 列表包含向量、矩阵、列表
list_data <- list(c("Google","Runoob","Taobao"), matrix(c(1,2,3,4,5,6), nrow = 2),
list("runoob",12.3))
# 给列表元素设置名字
names(list_data) <- c("Sites", "Numbers", "Lists")
# 添加元素
list_data[4] <- "新元素"
print(list_data[4])
# 删除元素
list_data[4] <- NULL
# 删除后输出为 NULL
print(list_data[4])
# 更新元素
list_data[3] <- "我替换来第三个元素"
print(list_data[3])
输出:
[[1]]
[1] "新元素"
$<NA>
NULL
$Lists
[1] "我替换来第三个元素"
也可以使用 c() 函数来创建列表,也可以使用该函数将多个对象合并为一个列表,例如:
# 创建包含数字的向量
numbers <- c(1, 2, 3, 4, 5)
# 创建包含字符的向量
characters <- c("apple", "banana", "orange")
# 合并两个数字向量
merged_vector <- c(numbers, c(6, 7, 8))
# 合并两个字符向量
merged_characters <- c(characters, c("grape", "melon"))
8.矩阵
# 定义行和列的名称
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])
输出:
col1 col2 col3
row1 3 4 5
row2 6 7 8
row3 9 10 11
row4 12 13 14
[1] 5
[1] 13
col1 col2 col3
6 7 8
row1 row2 row3 row4
5 8 11 14
9.数组
# 创建两个不同长度的向量
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])
输出:
COL1 COL2 COL3
3 12 15
[1] 13
COL1 COL2 COL3
ROW1 5 10 13
ROW2 9 11 14
ROW3 3 12 15
10.因子
因子(Factor) 是一种用于表示分类数据的数据类型。因子常用于处理具有有限类别(水平)的数据,比如性别、颜色、等级、州名等。因子与普通的向量不同,它不仅存储数据的值,还存储这些值的水平(levels),即类别标签。
因子由以下两部分组成:
- 因子值(Factor values) :实际的观测值。例如:
Male
,Female
,Red
,Blue
。 - 因子水平(Levels) :数据集中所有可能的类别或水平。例如,性别变量的水平可能是
Male
和Female
,颜色变量的水平可能是Red
、Blue
、Green
等。
1)R 语言创建因子使用 factor() 函数,向量作为输入参数。
x <- c("男", "女", "男", "男", "女")
sex <- factor(x)
print(sex)
print(is.factor(sex))
输出:
[1] 男 女 男 男 女
Levels: 男 女
[1] TRUE
2). 因子的水平(Levels)
# 创建一个因子
gender <- factor(c("Male", "Female", "Female", "Male", "Male"))
print(gender)
输出:
[1] Male Female Female Male Male
Levels: Female Male
3)因子的标签
# 设置因子水平和标签
color <- factor(c("red", "blue", "green", "blue"),
levels = c("red", "blue", "green"),
labels = c("Red", "Blue", "Green"))
print(color)
输出:
[1] Red Blue Green Blue
Levels: Red Blue Green
11.数据框
数据框(Data frame)可以理解成我们常说的"表格"。
数据框是 R 语言的数据结构,是特殊的二维列表。
数据框每一列都有一个唯一的列名,长度都是相等的,同一列的数据类型需要一致,不同列的数据类型可以不一样。
table = data.frame(
姓名 = c("张三", "李四"),
工号 = c("001","002"),
月薪 = c(1000, 2000)
)
print(table) # 查看 table 数据
输出
姓名 工号 月薪
1 张三 001 1000
2 李四 002 2000
合并数据框:
# 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)
输出:
[1] "----- INNER JOIN -----"
SiteId Site Country
1 2 Runoob CN
2 4 Facebook USA
3 6 Weibo CN
[1] "----- FULL JOIN -----"
SiteId Site Country.x Country.y
1 2 Runoob CN CN
2 4 Facebook USA USA
3 6 Weibo CN CN
4 7 <NA> <NA> USA
5 8 <NA> <NA> IN
[1] "----- LEFT JOIN -----"
SiteId Site.x Country Site.y Country.x Country.y
1 2 Runoob CN Runoob CN CN
2 4 Facebook USA Facebook USA USA
3 6 Weibo CN Weibo CN CN
[1] "----- RIGHT JOIN -----"
SiteId Site.x Country Site.y Country.x Country.y
1 2 Runoob CN Runoob CN CN
2 4 Facebook USA Facebook USA USA
3 6 Weibo CN Weibo CN CN
4 7 <NA> <NA> <NA> <NA> USA
5 8 <NA> <NA> <NA> <NA> IN
安装库(类似于python的pip)
# 安装库,MASS 包含很多统计相关的函数,工具和数据集
install.packages("MASS", repos = "https://mirrors.ustc.edu.cn/CRAN/")
# melt() 和 cast() 函数需要对库
install.packages("reshape2", repos = "https://mirrors.ustc.edu.cn/CRAN/")
install.packages("reshape", repos = "https://mirrors.ustc.edu.cn/CRAN/")
# 载入库
library(MASS)
library(reshape2)
library(reshape)
# 创建数据框
id<- c(1, 1, 2, 2)
time <- c(1, 2, 1, 2)
x1 <- c(5, 3, 6, 2)
x2 <- c(6, 5, 1, 4)
mydata <- data.frame(id, time, x1, x2)
# 原始数据框
cat("原始数据框:\n")
print(mydata)
# 整合
md <- melt(mydata, id = c("id","time"))
cat("\n整合后:\n")
print(md)
输出:
原始数据框:
id time x1 x2
1 1 1 5 6
2 1 2 3 5
3 2 1 6 1
4 2 2 2 4
整合后:
id time variable value
1 1 1 x1 5
2 1 2 x1 3
3 2 1 x1 6
4 2 2 x1 2
5 1 1 x2 6
6 1 2 x2 5
7 2 1 x2 1
8 2 2 x2 4
12.R----csv处理
1)data <- read.csv("sites.csv", encoding="UTF-8")
print(data)
2)data <- read.csv("sites.csv", encoding="UTF-8")
print(is.data.frame(data)) # 查看是否是数据框
print(ncol(data)) # 列数
print(nrow(data)) # 行数
3)
data <- read.csv("sites.csv", encoding="UTF-8")
# likes 最大的数据
like <- max(data$likes)
print(like)
4)查找
data <- read.csv("sites.csv", encoding="UTF-8")
# likes 为 222 的数据
retval <- subset(data, likes == 222)
print(retval)
5)保存
data <- read.csv("sites.csv", encoding="UTF-8")
# likes 为 222 的数据
retval <- subset(data, likes == 222)
# 写入新的文件
write.csv(retval,"runoob.csv")
newdata <- read.csv("runoob.csv")
print(newdata)
13.还有一些R语言操作mysql,xlsx,xml,绘图的例子,具体可以参考