R优势 |
缺点 |
开源、免费 |
维护凭自觉 |
跨平台 |
运算速度慢 |
支持脚本和批处理 |
for循环非常慢 |
统计问题支持良好 |
内存消耗大 |
画图方便 |
非命令行只支持单核计算 |
拓展方便 R包 |
R说明文档格式混乱 |
R安装、环境搭建
RStudio免费的IDE 用迅雷或IDM下载 速度快
R包镜像设置
R包--完成特定分析功能 用相应的 R程序包 实现
R界大佬
使用前环境environment清空
rm(list=ls())
基本操作
getwd() ##获取当前R工作目录 setwd(dir = "D:/Program Files/R") ##自定义R工作目录 list.files() ##查看R工作目录下的所有文件和文件夹(不能查看嵌套文件夹里的文件) dir() ##同上 x <- 1 ##赋值,局部变量 y = 1 ##同上,R中不推荐 z <<- 1 ##赋值,全局变量 m <- max(5,6,7) #取最大值 n = mean(c(8,9,10)) #取平均值 v = sum(3,4,5) #取和 ls() #查看所有变量 ls.str() #查看所有变量 类型 值 str(m) #查看该变量的类型 值 rm(x) #删除该变量 rm(y,z) #删除多个变量 rm(list = ls()) #删除所有变量 history() #查看所有历史命令 history(10) #查看最近10条历史命令 save.image() #保存当前工作空间(会在之前设置的R工作目录中生成一个".RData"文件) q() #退出软件
R包操作
install.packsges("vcd") #安装 vcd包 install.packages(c("AER","ca")) #安装多个包 update.packages() #更新所有包 detach("package:包名") #移除内存加载的包 remove.packages("包名") #删除已安装包 library(包名) #载入包 require(包名) #同上 help(package="包名") #包的帮助文档 library(help="包名") #包的基础信息(说明书) ls("package:包名") #包中包含的函数 data(package="包名") #包中的数据集 .libPaths() #显示R默认安装包的位置 library() #显示当前R环境中所有包
Push、Clone项目 包的处理
Push处理 installed.packages() #显示已安装包 installed.packages()[,1] #显示包的第一列 即 已安装包的名字 Rpack <- installed.packages()[,1] save(Rpack,file="Rpack.Rdata") #包名保存到 Rpack.Rdata 文件中 Clone处理 for(i in Rpack) install.packages(i) #一次安装所有缺少的包
使用
R自带基础包
base |
utils |
graphics |
methods |
stats4 |
datasets |
grDevices |
stats |
splines |
tcltk |
获取帮助
help.start() #显示帮助文档
help(sum) #打开sum函数帮助文档 args(sum) #显示sum函数需要的参数 example(sum) #显示sum函数的示例
内置数据集
help(packages = "datasets") #打开R中数据集的帮助文档 data() #显示所有数据集 rivers #河流长度数据集
变量命名,尽量避开数据集名
如被覆盖
data("rivers")
数据结构
数据类型
数值型 |
直接运算 |
字符串型 |
连接,提取,转换 |
逻辑型 |
真,假 |
日期型 |
数据结构:向量、标量、列表、数组、多维数组
一维向量(默认列向量,行向量需转置)
x <- c(1,2,3) #函数c创建,默认列向量 数值型 numeric y <- c(4,5,6,"rrt") #含有字符,所有元素强制转为字符型 "4""5""6""rrt" z <- c("one","two","three") #字符串型 character m <- c(TRUE,T,F) #逻辑型 logical
长度、类型
length(x) #求向量的长度 mode(m) #求向量的类型
向量索引
正(负)数索引
逻辑索引
名称索引
x[1] #输出x向量 第1个元素 x[c(4,6)] #输出第4,6个元素 x[-1] #输出除了第1个元素外的所有元素 x[c(-4,-6)] #输出除了第4,6个元素外的所有元素 x[x>0] #输出正数 x[x <= -2 | x > 5] #输出小于等于2 或者 大于5 的数 x[c(F,T)] #输出第2n个元素 x[c(T,F)] #输出第2n-1个元素 x[c(F,F,T)] #输出第3n个元素 x > 0 #输出 TRUE FALSE 每项元素判断后布尔值 pH <- c(area1=4.5, area2=7, mud=7.3, dam=8.2, middle=6.3) #此时索引可以用名字来索引内容,如pH['mud']等,类似于python语言中的Dict(字典)
%in%在字符串向量中的使用
x <- c("one","two","three","four","five") "one" %in% x #TRUE 判断字符串"one"是否在向量中 y <- c("one","two","three") y %in% x #TRUE TRUE TRUE 判断y每个元素是否在x向量中 x %in% y #TRUE TRUE TRUE FALSE FALSE FALSE 判断x每个元素是否在y向量中
向量的增删
x <- c(1:5) #创建向量 1,2,3,4,5 x[10] <- 10 #第10个元素赋值为10 x #1 2 3 4 5 NA NA NA NA 10 append(x,66,after = 3) #向量x的第3个元素后赋值66 1 2 3 66 5 NA NA NA NA 10 x <- x[-c(1:3)] #删除向量第1-3个元素 rm(x) #删除向量x
向量与向量的运算
长度一致,对应位置 加减乘除
v1 <- c(4,6,87) v2 <- c(34,32.5,12) v1+v2 #结果 38.0 38.5 99.0 v2 / v1 #除 v2 %/% v1 #整除 v2 %% v1 #取余
长度不一致,(要求成倍数),循环n次
v1 <- c(1:4) v2 <- c(1,2) v1+v2 #结果 2,4,4,6
常用的运算函数
abs(x) #绝对值 sqrt(x) #开平方 sqrt(x[c(3:4)]) #第3,4个元素开平方 log(x[c(3:4)) #求对数 10为底 log(16, base = 2) #2为底 ceiling(x) #向上取整 floor(x) #向下取整 trunc(x) #保留整数部分 与上面的区别 同时出现正负数时,结果不同 round(x, digits = 2) #保留2 位小数 sin(x) #三角函数 cos(x) max(x) min(x) range(x) #求范围(即最大值和最小值) var(x) #方差 sd(x) #标准差 median(x) #中位数 quantile(x) #四分位数 quantile(x,c(0.2, 0.5, 0.8)) #自定义分割
由值求索引
which.max(x) #最大值的索引 which.min(x) #最小值的索引 which(x == 5) #等于5的元素的索引 which(x > 5) #大于5的元素的索引
向量的名字
> x <- c(1:5) > y <- c("one","two","three","four","five") > names(x) <- y > x one two three four five 1 2 3 4 5 > x["one"] #由表头访问 one 1 > x[1] #由值访问 one
矩阵
矩阵(Matrix)是按照长方形阵列排列的数的集合。向量是一维的,矩阵是二维的
矩阵创建
m <- matrix(1:20,4,5) #4行5列,默认从列开始排 n <- matrix(1:20,4,5,byrow = T) #从行开始排
矩阵每一维添加名字
rnames <- c("R1","R2","R3","R4") cnames <- c("C1","C2","C3","C4","C5") dimnames(m) <- list(rnames,cnames) m
矩阵的维数
x <- c(1:20) dim(x) #向量的维数是0 dim(x) <- c(4,5) #向量x改为4行5列 dim(x) <- c(2,2,5) # 改为2行2列 高度为5 x , , 1 [,1] [,2] [1,] 1 3 [2,] 2 4 , , 2 [,1] [,2] [1,] 5 7 [2,] 6 8 , , 3 [,1] [,2] [1,] 9 11 [2,] 10 12 , , 4 [,1] [,2] [1,] 13 15 [2,] 14 16 , , 5 [,1] [,2] [1,] 17 19 [2,] 18 20
array函数
?array #打开array函数的用法 arr_name_1 <- c("A1","A2") arr_name_2 <- c("B1","B2","B3") arr_name_3 <- c("C1","C2","C3","C4") array(1:24,c(2,3,4),dimnames = list(arr_name_1, arr_name_2, arr_name_3))#创建一个矩阵 2行3列4高 行名 列名 高名
访问矩阵中的元素
单个元素访问
x <- matrix(1:20, 4, 5) x[1,2] #访问第1行 第2列 的元素 x[4] #访问 第一列开始数第4个元素
多个元素访问
x <- matrix(1:20, 4, 5) x[2,c(2,4)] #访问第 2 行 第2,4列 的元素 x[c(3:4),c(2:4)] #访问第 3,4 行 第 2,3,4 列 的元素 x[2,] #访问第 2 行元素 x[ ,3] #访问第 3 列元素 x[-1,3] #访问第 3 列元素,除第一个外
维名访问
x <- matrix(1:20, 4, 5) dimnames(x) <- list(c("B1","B2","B3","B4"),c("A1","A2","A3","A4","A5")) x["B1",c(2:5)] #B1行 第2,3,4,5列元素 x["B1","A4"] #访问B1行 A4列元素 x["B1",] x[,"A3"]
矩阵运算
对应元素加减乘
x <- matrix(1:20, 4, 5) x+1 #所有元素加1 x+x #对应元素相加 x*x #对应元素相乘 即 矩阵的外积 ;最后一个元素 20*20
常用的内置函数
x <- matrix(1:20, 4, 5) sum(x) #矩阵所有元素相加 max(x) #矩阵最大值 colSums(x) #矩阵每一列和 rowSums(x) #矩阵每一行和 colMeans(x) #每一列平均值 y <- matrix(1:4, 2, 2) z <- matrix(2:5, 2, 2) y %*% z #矩阵乘法 即 矩阵的内积 diag(x) #矩阵对角线元素 t(x) #矩阵转置
修改/增添 数据
x <- matrix(1:20, 4, 5) dimnames(x) <- list(c("B1","B2","B3","B4"),c("A1","A2","A3","A4","A5")) transform(x,A1=A1*5) #行列数据修改 原矩阵没被修改 transform(x,A6 = rowSums(x)) #增添 1 列数据 cbind(x,sum = rowSums(x)) #增添数据 cbind函数 矩阵+数组的合并 增添列 rbind(x,sum = colSums(x)) #增添数据 rbind函数 矩阵+数组的合并 增添行 x["B1","A2"] <- 3 #单个数据修改 原矩阵被修改了
apply() 自定义操作函数(矩阵&数据集)
> ?apply(array, margin, ...) # 可以进行自定义function > apply(WorldPhones, MARGIN = 1, FUN = sum) # MARGIN = 1 即行名操作 1951 1956 1957 1958 1959 1960 1961 74494 102199 110001 118399 124801 133709 141700 > apply(WorldPhones, MARGIN = 2, FUN = sum) # MARGIN = 2 即列名操作 N.Amer Europe Asia S.Amer Oceania Africa Mid.Amer 467233 240404 43605 19406 18375 10388 5892 > apply(WorldPhones, MARGIN = 1, FUN = mean) 1951 1956 1957 1958 1959 1960 1961 10642.00 14599.86 15714.43 16914.14 17828.71 19101.29 20242.86 > apply(WorldPhones, MARGIN = 1, FUN = max) 1951 1956 1957 1958 1959 1960 1961 45939 60423 64721 68484 71799 76036 79831
rev() 向量、矩阵倒序
> letters [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" [24] "x" "y" "z" > rev(letters) [1] "z" "y" "x" "w" "v" "u" "t" "s" "r" "q" "p" "o" "n" "m" "l" "k" "j" "i" "h" "g" "f" "e" "d" [24] "c" "b" "a" > women height weight 1 58 115 2 59 117 3 60 120 ...... > women[rev(row.names(women)),] height weight 15 72 164 14 71 159 13 70 154 ......
注意:rev()倒序矩阵 参数只能是矩阵的行名
sort 向量、矩阵的排序
rivers sort(rivers) #正序,升序 sort(rivers, decreasing = T) #倒序 sort(women$height) sort(women$height, decreasing = T)
注意:sort()倒序矩阵 参数是列名 输出的是列的数据,是向量 失去了与矩阵的关联性
mtcars[rev(row.names(mtcars)),] #原数据 倒序 mtcars[sort(row.names(mtcars)),] #按行名排序 升序 mtcars[rev(sort(row.names(mtcars))),] #按行名倒序
order 矩阵自定义排序
sort(rivers) #升序 order(rivers) #升序 返回的是 位置(下标) mtcars order(-mtcars$mpg) #mpg行,倒序 返回的是位置(下标) mtcars[order(mtcars$mpg),] #mpg行,升序 mtcars[order(mtcars$mpg, decreasing = T),] #mpg行,倒序 mtcars[order(-mtcars$mpg),] #同上 mtcars[rev(order(mtcars$mpg)),] #同上 mtcars[order(mtcars$mpg, mtcars$cyl),] # 当两行的mpg数据一样时,再根据cyl数据来排序
列表
其他编程语言中 列表与数组 差不多
R中 列表是最复杂的数据结构
列表是一些对象的有序集合。可以存储向量、矩阵、数据框,甚至其他列表的组合
列表的特点
- 模式上和向量类似,一维数据集合
- 列表可以存储R中任何数据结构,甚至列表本身
创建列表
a <- (1:5) b <- matrix(1:20, 4, 5) c <- 5 d <- "This is a string." mlist <- list(a, b, c, d) #组建列表 mlist #输出
访问列表
mlist[1] #访问列表的第一个成分,返回结果仍是 列表 mlist[c(2,3)] #访问列表的第2,3成分,返回结果是 列表 mlist[[1]] #访问列表的第一个成分所有元素,返回结果是 元素本身的格式 mlist[[1]][1] #访问列表第一个成分的第一个元素
列表成分命名
mlist <-list(first=a, second=b, third=c, forth=d)
通过列表成分名访问
mlist$forth #访问forth成分 本来的形式 mlist[4] #同上 列表形式呈现 > class(mlist$forth) [1] "character" > class(mlist[4]) [1] "list" mlist$second[1] #访问second成分即矩阵,的第1个元素
删除列表中的元素
mlist[c(-1,-2)] #返回除 1,2 成分外的所有成分;原列表 没被修改 mlist[4] <- NULL #删除第4成分 mlist$third <- NULL #删除第3成分
lapply()与sapply()
apply(WorldPhones,MARGIN = 1, FUN = sum) #apply()函数职能应用于矩阵和数据集 lapply(state.center, F