R语言学习
前言
虽然但是,还是系统的学了一遍R
。但实际体验下来,感觉和Python
的pandas
包非常的类似,感觉天下的统计的语言都是一家。
基本数据结构
向量
基本概念
数值型
1 | > x <- c(1, 2, 3, 4, 5) |
字符串型
1 | > y <- c("one", "two", "three") |
逻辑型(全部大写)
1 | > z <- c (T, F, T) |
等差数列
1 | > c(1:10) |
seq()函数
生成等差数列,from
与to
控制起始与终点,by
控制数列间距,length.out
控制数列个数
1 | > seq(from = 1, to = 10, by = 5) |
rep()函数
重复生成向量,重复项可以是数值也可以是数组
1 | > rep(2, 5) |
1 | > rep(x, each = 5) |
变量转换
数值型变量统一转换为字符串型变量
1 | > a <- c(1, 2, "three") |
向量索引
整数索引
1 | > x <- c(1:10) |
逻辑向量索引
数值向量
1 | > x <- c(1:10) |
字符串向量
1 | > x <- c("one", "two", "three", "four", "five") |
名称索引
1 | > x <- c(1:5) |
修改向量值
添加值
1 | > x <- c(1:5) |
append
函数
1 | > append(x = x, values = 10, after = 9) |
删除向量
1 | > rm(x) |
删除值
1 | > x <- c(1:10) |
通过索引修改值
1 | > x <- c(1:5) |
数值型的向量,不能赋值给字符串,会把整个向量变成字符型向量
1 | > x <- c(1:5) |
向量运算
数值运算
1 | > x <- 1:10 |
幂运算:**
求余运算:%%
整除运算:%/%
1 | > x |
对应位置进行运算,若向量长度不同,则长向量的长度必须是短向量的整数倍
1 | > x <- c(1, 3) |
逻辑运算
1 | > y <- c(5:-5) |
数学运算符
1 | > x <- c(-5:5) |
ceiling()
不小于x的最小整数,floor()
函数不大于x的最大整数
1 | > ceiling(c(-2.3, 3.1415)) |
统计函数
1 | > vec <- c(1:100) |
1 | > t <- c(1, 2, 4, 6, 7,-2) |
多维向量
矩阵
1 | > m <- matrix(1:20, nrow = 4, ncol = 5) |
默认按列进行分布
1 | > m <- matrix(1:20, 4) |
按行分布
1 | > m <- matrix(1:20, 4, byrow = T) |
按列分布
1 | > m <- matrix(1:20, 4, byrow = F) |
定义矩阵行与列的名字
1 | > rnames <- c("R1", "R2", "R3", "R4") |
矩阵维数
1 | > dim(m) |
使向量转化为矩阵
1 | > x <- c(1:20) |
多维数组
1 | > x <- c(1:20) |
1 | > dim1 <- c("A1", "A2") |
索引
1 | > m <- matrix(1:20, 4, 5, byrow = T) |
1 | > rnames <- c("R1", "R2", "R3", "R4") |
矩阵的运算
四则运算
1 | > rnames <- c("R1", "R2", "R3", "R4") |
矩阵函数
1 | rnames <- c("R1", "R2", "R3", "R4") |
矩阵内积与外积
1 | > m <- matrix(1:9, nrow = 3, ncol = 3) |
对角线与转置
1 | > m <- matrix(1:9, nrow = 3, ncol = 3) |
列表
1 | > a <- c(1:20) |
使用名称值
1 | > a <- c(1:20) |
索引
1 | > mlist[1] |
$
字符访问
1 | > mlist$first |
两个中括号访问数据原本类型,一个中括号只能访问列表
1 | > mlist[1] |
给列表赋值
1 | > mlist[5] <- iris |
删除元素
赋值NULL
1 | > mlist[5] <- NULL |
负索引
1 | > mlist <- mlist[-5] |
数据框
数据框(Data frame)可以理解成我们常说的"表格"。数据框是 R 语言的数据结构,是特殊的二维列表。数据框每一列都有一个唯一的列名,长度都是相等的,同一列的数据类型需要一致,不同列的数据类型可以不一样。
1 | > mystate <- data.frame(state.name, state.abb, state.region) |
索引
1 | > mystate <- data.frame(state.name, state.abb, state.region) |
attach()
函数加载数据框
1 | > attach(mtcars) |
行名
1 | > rownames(mtcars) |
列名
1 | > colnames(mtcars) |
detach()
函数取消加载
1 | > detach(mtcars) |
with()
函数访问数据
1 | > with(mtcars,{sum(mpg)}) |
因子
用于表示一组数据中的类别,可以记录这组数据中的类别名称及类别数目
名义型变量
1 | > f <- factor(c("red", "red", "green", "blue", "green", "blue", "blue")) |
有序型变量
1 | > week <- factor(c("Mon", "Fri", "Thu", "Wed", "Mon", "Fri", "Sun")) |
因子图
1 | > plot(mtcars$cyl) |
cut()函数
分割数据集
1 | > num <- c(1:100) |
缺失数据处理
NA
表示缺失值
1 | > a <- c(NA, 1:49) |
缺失值的运算
1 | > NA + 1 |
跳过缺失值
1 | > a <- c(NA, 1:49) |
删除缺失值
1 | > a <- c(NA, 1:10, NA, 10:20, NA, NA) |
na.omit()
删除数据集中缺失数据所在的行
1 | > install.packages("VIM") |
其他缺失值
NaN
表示不存在的值
Inf
表示无穷值
1 | > 1 / 0 |
字符串
统计字符串长度
1 | > nchar("Hello World") |
连接字符串
1 | > paste("I", "Love", "bnu") |
截取字符串
1 | > substr(x = month.name, start = 1, stop = 3) |
修改字符串大小写
1 | > temp <- substr(x = month.name, start = 1, stop = 3) |
查询字符串元素
1 | > x <- c("a", "A", "+", "A+", "+A", "+a", "a+A") |
分割字符串
输出列表格式
1 | > path <- "/usr/local/bin/R" |
日期与时间
1 | > Sys.Date() |
字符串转换为日期
1 | > a <- "2022-09-28" |
日期序列
1 | > seq(as.Date("2022-08-07"), as.Date("2022-09-28"), by = 3) |
1 | > scores <- round(runif(48, min = 50, max = 100)) |
对文件的操作
读入数据
键盘输入
1 | > patientID <- c(1:4) |
edit()
函数
1 | > datacopy <- |
fix()
函数
1 | fix(datacopy) |
读取外部文件
更改文件路径
1 | > getwd() |
read.table()
读取文件(相对路径)
1 | > x <- read.table("input.txt") |
head()
与tail()
查看数据首尾
1 | > head(x) |
sep
分隔符
1 | > x <- read.table("input.csv", sep = ",") |
header = TRUE
将第一行数据作为变量名
1 | > x <- read.table("input.csv", sep = ",", header = TRUE) |
skip
跳过文件部分内容(跳过内容多为文件注释)
1 | > x <- read.table("input 1.txt", header = TRUE, skip = 5) |
nrows
确定读取文件行数
1 | > x <- read.table("input 1.txt", skip = 20, nrows = 50) |
na.strings
确认缺失值
1 | > x <- read.table("input.txt", na.strings = "NA") |
stringsAsFactors
将字符串数据转化成因子
read.csv()
读取csv文件
1 | > x <- read.csv("input.csv") |
读取网络上的文件,将下载到本地
1 | > x <- read.table("https://codeload.github.com/mperdeck/LINQtocSV/zip/master", header = TRUE) |
读取网页表格
1 | > install.packages("XML") |
读取剪贴板Ctrl C
上的文件
1 | > x <- read.table("clipboard", header = TRUE, sep = "\t") |
读取压缩格式的文件
1 | > x <- read.table(gzfile("input.txt.gz")) |
readLines()
读取文件固定行
1 | > x <- readLines("input.csv", n = 5) |
scan()
读取文件固定行
1 | > x <- scan("scan.txt", what = list(X1 = character(3), X2 = character(0), X3 = character(0))) |
访问数据库系统
1 | > install.packages("RODBC") |
写入文件
写入向量
1 | > x = rivers |
写入表格
1 | > x <- read.table("input.txt", header = TRUE) |
去除行号
1 | > write.table(x, file = "newfile.csv", sep = ",", row.names = FALSE) |
append
将追加到已有文件结尾
1 | > write.table(iris, file = "newfile.txt",skip = 1, append = TRUE) |
写入压缩文件
1 | > write.table(mtcars, gzfile("nwefile.txt.gz")) |
读写Excel文件
安装XLConnect
包,必须先下载好Java
1 | > install.packages("XLConnect") |
读取Excel文件
1 | > ex <- loadWorkbook("data.xlsx") |
1 | > readWorksheet(ex, 1, startRow = 0, startCol = 0, endRow = 10, endCol = 3, header = TRUE) |
一步完成
1 | > readWorksheetFromFile("data.xlsx", 1) |
写入Excel文件
1 | > wb <- loadWorkbook("exfile.xlsx", create = TRUE) |
一步完成
1 | > writeWorksheetToFile("exfile.xlsx", data = iris, sheet = "Sheet 1") |
xlsx包读写Excel文件
1 | > x <- read.xlsx("data.xlsx", 1, startRow = 1, endRow = 10) |
读写R格式文件
RDS文件
1 | > saveRDS(iris, file = "iris.RDS") |
1 | x <- readRDS("iris.RDS") |
Rdata文件
1 | > save(iris, iris3, file = "iris.Rdata") |
保存所有对象
1 | > save.image() |
数据转换
数据类型转化
is.data.frame()
判断数据框
1 | > library(xlsx) |
as.data.frame
转化为数据框
1 | > is.data.frame(state.x77) |
as.matrix()
转化为矩阵,但出现字符型时,会将数值全部转化成字符串
1 | > data <- data.frame(state.region, state.x77) |
as.vector
转化为向量
1 | > as.vector(state.x77) |
as.factor()
转化为因子
1 | > x <- state.abb |
as.list()
转化为列表
1 | > x <- state.abb |
unname()
去除列明,unlist()
转化为向量
1 | > x <- state.abb |
选取子集
索引选取子集
View()
打开数据窗口
1 | > who <- read.csv("WHO.csv", header = TRUE) |
逻辑判断选取子集
1 | > who3 <- who[which(who$Continent == 7), ] |
subset()
函数选取子集
1 | who4 <- subset(who, who$CountryID > 50 & who$CountryID <= 100) |
sample()随机抽样
1 | > x <- 1:100 |
1 | > who <- read.csv("WHO.csv", header = TRUE) |
删除固定行与列
1 | > head(mtcars) |
数据框的添加与合并
合成一个数据框
1 | > USArrests |
cbind()与rbind()函数
1 | > cbind(USArrests, state.division) |
去除重复行
1 | > data1 <- head(USArrests, 30) |
merge()函数
1 | > x <- data.frame(k1 = c(NA, NA, 3, 4, 5), k2 = c(1, NA, NA, 4, 5), data = 1:5) |
修改数据的值
t()
转置
1 | > sractm <- t(mtcars) |
rev()
翻转向量
1 | > letters |
1 | > women |
transform()
函数修改列值
1 | > transform(women, weight = weight * 2) |
排序
sort()
向量排序
1 | > rivers |
数据框排序
1 | > mtcars[sort(rownames(mtcars)),] |
order()
order()
返回排序位置
向量排序
1 | > order(rivers) |
数据框排序
1 | > mtcars[order(mtcars$mpg), ] |
多个条件排序
1 | > mtcars[order(mtcars$mpg, mtcars$disp), ] |
数学计算
1 | > WorldPhones |
apply()
函数处理数组与数据框
1 | > apply(worldphones, MARGIN = 1, FUN = sum) |
lapply()
函数处理列表,转化为列表
1 | > state.center |
sapply()
函数处理列表,转化为列表
1 | > sapply(state.center, FUN = length) |
1 | > state.name |
数据标准化处理\
1 | heatmap(as.matrix(mtcars)) |
1 | > x <- scale(mtcars, center = TRUE, scale = TRUE) |
reshape2包
类似数据库的操作
1 | > install.packages("reshape2") |
1 | > airquality |
melt()函数
1 | > melt(airquality) |
1 | > aql <- melt(airquality, id.vars = c("month", "day")) |
1 | > aqw <- dcast(aql,month + day ~ variable) |
dcast()函数
类似透视表
1 | > aqw2 <- dcast(aql,month ~ variable,fun.aggregate = mean,na.rm = TRUE) |
tidyr包
1 | > install.packages(c("tidyr", "dplyr")) |
gather()函数
1 | > mtcars |
spread()函数
1 | > gdata <- gather(tdata, key = "Key", value = "Value", 2:4) |
separate()函数
1 | > df <- data.frame(x = c(NA, "a.b", "a.d", "b.c")) |
unite()函数
1 | > x <- separate(df, col = x, into = c("A", "B"), sep = "-") |
dplyr包
1 | install.packages("dplyr") |
dplyr::filter()
按条件筛选
1 | > dplyr::filter(iris, Sepal.Length > 7) |
dplyr::distinct()
去除重复行
1 | > rbind(iris[1:10, ], iris[1:15, ]) |
dplyr::slice()
取出数据的任意行
1 | > dplyr::slice(iris, 10:15) |
dplyr::sample()
随机抽取行数
1 | > dplyr::sample_n(iris, 10) |
按比例抽取行数
1 | > dplyr::sample_frac(iris, 0.1) |
dplyr::arrange()
以某一列为基准排序
1 | > dplyr::arrange(iris, Sepal.Length) |
1 | > dplyr::arrange(iris, desc(Sepal.Length)) |
summarise()
1 | > summarise(iris, avg = mean(Sepal.Length)) |
链式操作符 %>%
1 | > head(mtcars, 20) |
dplyr::group_by()
分组
1 | > dplyr::group_by(iris, Species) |
dplyr::mutate()
添加新的变量
1 | > dplyr::mutate(iris, new = Sepal.Length + Petal.Length) |
链接函数
1 | > a = data.frame(x1 = c("A", "B", "C"), x2 = c(1, 2, 3)) |
交集并集补集
1 | > mtcars <- mutate(mtcars, Model = rownames(mtcars)) |
交集
1 | > intersect(first, second) |
并集
1 | > dplyr::union_all(first, second) |
不交并
1 | > dplyr::union(first, second) |
补集
1 | > setdiff(first, second) |