R语言起源
R语言由新西兰奥克兰大学Ross Ihaka和Ribert Gentlenman两人共同发明,其词法和语法分别源自Scheme和S语言。
R定义:一个能够自由有效地用于统计计算和绘图的语言和环境,它提供了广泛的统计分析和绘图技术。
R语言的优势
- 免费开源
- 全面的统计研究平台,提供各种各专业的数据分析技术
- 是一个程序设计语言,所以他的能力很容易通过使用用户定义的函数扩展
- 拥有顶尖水准的制图功能
- 开源从多个数据源获取数据并将其转换为可用的形式
- 可运行在多种平台上
R的学习资源
R的安装
下载:
进入R的主页http://www.r-project.org,找到download,选择一个镜像进入,然后选择适合自己电脑的版本进行下载
2.安装:
默认安装即可
R的基本使用/常用命令
变量是区分大小写的
r的赋值符号可以为=
或者<-
(更常用后者)
a <- 3
b <<- 2
s <- sum(1,2,3,4) m <- mean(1,2,3,4) m1 <- max(1,5,2,3)
|
查看和删除对象:
ls() ls.str() ls(all.names = TRUE)
length(a)
mode(v)
rm(a) rm(b,c) rm(list = ls())
args(com)
|
向量的操作:
y <- sqrt(a)
z <- a + a2
x <- 1:1000
seq(1,20,3)
rep(5,15) rep(1:3, 3)
x = rep(v, each = n)
rnorm(10)
rnorm(6, mean=5, sd=2)
x <- c(0, -3, 4, -1, 45, 98, 12) x[x>0] x[x>=2 | x<5] x[-5] x[-(1:3)]
x = round(v)
> order(x)
> rank(x)
> sort(x)
> tapply(x,f,g)
> split(x,f)
> diff(x)
> cumsum(x)
|
查看历史命令:
与逻辑型数据有关的基本操作:
is.data.frame(x)
> all(x>a)
> any(x>a)
> x>y
> x[x>a]
> subset(x, x>a)
> which(x, x>a)
> x = ifelse(b, u, v)
|
一个简单例子:

age <- c(1,3,5,2,11,9,3,9,12,3) weight <- c(4.4,5.3,7.2,5.2,8.5,7.3,6.0,10.4,10.2,6.1)
mean(weight) sd(weight)
cor(age,weight)
plot(age,weight)
demo() demo(graphics)
|
查看帮助文档:
help.start() help("mean") help(package="base") ?mean
|
**R的工作空间:是当前所有的变量都存放的位置
建议养成习惯:给每个项目单独设置一个工作空间
getwd()
setwd(dir="d://RProject/test1")
list.files() dir()
save.image()
|
R包的使用
R的包(package)可以从:http://cran.r.project.org/web/packages下载。
R自带了一系列默认包(base、datasets、grephics、methods等)
包的使用:
library()
install.packages("car")
help(package="car")
library(ggplot) require(ggplot)
update.packages()
library(help = AER)
detach(package:zoo)
search(reshape)
|
一般对象的基本操作:
objects() ls()
mode(x)
class(x)
> as.matrix(x)
> as.numeric(x)
>as.factor(x)
> str(x)
> rm(x)
> rm(list=ls(all=TRUE))
>head(x)
|
结果的重用:
head(mtcars)
lm(mpg~wt, data=mtcars)
result <- lm(mpg~wt, data=mtcars)
summary(result)
predict(result, mynewdata)
|
R如何处理大数据集:
r的运算都是基于内存的,但是对于很大的数据运算显然是不合适的:
- R有专门用于大数据的分析报告,如lm()是做线性拟合的函数,而biglm()则能以内存搞笑的方式实现大型数据的线性模型拟合
- R与大数据处理平台的结合,如RHadoop、RHive、RHipe等
数据集
按照某种格式来创建数据集,是任何数据分析的第一步:
- 选择一种数据结构来存储
- 将数据输入或导入这个数据结构中
向R中导入数据有很多方便的方法,可以手工输入数据,也可以从外部源导入数据,数据源可以是电子表格、文本文件、统计软件(SAS)和各类数据库等
数据集通常由数据构成的一个矩形数组,行表示记录,列表示属性(字段)。
R拥有许多用于存储数据的对象类型,包括向量、矩阵、数组、数据框和列表,这些数据结构在存储数据的类型、创建方式、定位和访问我中个别元素的方法等方面都有所不同。
列表:向量、矩阵、数组、数据库、列表
向量:
只能包括一种数据类型
a <- c(1,3,5,7,-5) a2 <- c("one", "two", "three") a3 <- c(1,2,6,"three")
a2[2] a[1:3] a[c(1,3,4)]
a2[2] <- "four"
y <- sqrt(a)
z <- a + a2
x <- 1:1000
seq(1,20,3)
|
矩阵:
只能包括一种数据类型,二维的
?matrix
y = matrix(5:24,nrow=4,ncol=5)
x=c(2,4,6,8) rowname <- c("R1", "R2") colname <- c("C1", "C2")
newMymatrix <- matrix(x, nrow=2,ncol=2,byrow=TRUE,dimnames=list(rowname,colname))
newMymatrix2 <- matrix(x, nrow=2,ncol=2,dimnames=list(rowname,colname))
newMymatrix2[1,] newMymatrix2[1,3] newMymatrix2[,3]
M = rbind(X,Y)
M = cbind(X,Y)
diag(M)
eigen(M)$val eigen(M)$vec
|

数组:
维度是可以大于2的,元素也只能是一种类型的
?array
dim1 <- c("A1", "A2", "A3") dim2 <- c("B1", "B2") dim3 <- c("C1", "C2", "C3", "C4")
d <- array(1:24, c(3,2,4), dimname=list(dim1.dim2,dim3))
d[1,2,3]
|
数据框
可以存储多种类型的数据
数据框会是我们以后更经常遇到的一种结构
id <- c(1,2,3,4) age <- c(25,34,28,52) itype <- c("Type1","Type2","Type3","Type2") status <- c("poor", "Improved", "Excellent", "poor")
patientsData <- dada.frame(id, age, itype, status)
patientsData[1:2] patientsData[c("itype", "status")] patientsData$age
attach(mtcars) mgp detach(mtchar)
with(mtcars, { ll <- mpg ll })
fix(Data)
|
因子
itype <- c("Type1","Type2","Type3","Type2")
itype <- factor(itype)
|
待查资料
https://www.runoob.com/r/r-factor.html
列表
是较复杂的数据类型
g <- "First list" h <- c(23,45,66,997) j <- matrix(1:10, nrow=2) k <- c("one", "two", "three")
myList <- list(g, h, j, k)
myList[[2]]
|
myLi <- list(stu.id=1234, stud.name="Tom", stud.marks="12,3,14,25,66")
myLi[[1]] mode(myLi[[1]])
myLi[1] mode(myLi[1])
myLi$stud.id
names(myLi) names(myLi) <- c("idid", "name", "marks")
unname(L)
myLi$parents <- c("Mom1", "Baba1") length(myLi)
myLi <- myLi[-4]
other <- list(age=19, gender="male") lst <- c(myLi, other)
unlist(lst)
|
R的数据源导入的方法
可导入的数据源:
1.键盘输入
mydata <- edit(mydata)
fix(mydata)
|
2.从文本文件导入
r默认只能读取ascii编码的(ANSI),utf8等会有问题
文本文件的格式每行字段间用逗号隔开的
使用read.table()
读取
data <- read.table("f:/data/q.txt",header=True,sep=",")
head(data)
|
3.导入Excel数据
导入excel数据方式很多(如),但比较复杂,这里选择简便的方式:另存excel文件类型选择csv
,并以逗号分隔,再read.csv()
目的是读入数据的结果,不在乎手段,所以越简单越好
4. ……
用户自定义的函数
格式:
myFUnction <- function(arg1, arg2, ...){ statements return(obj) }
|
实例1:获取系统时间,指定格式并输入
mydate <- function(type){ switch(type, long = format(Sys.time(), "%A %B %d %Y"), short = format(Sys.time(), "%m-%d-%y"), cat(type, "is not reccongnized type\n") ) }
mydate("long") mydate("short")
|
实例2:求1….n的和
sum <- function(num){ for(i in 1:num){ x <- x + i } return(x) }
fix(sum)
sum(10)
|
R访问MySQL数据库
准备工作步骤:
- 安装RODBC包:
install.packages("RODBC")
- 在http://dev.mysql.com/downloads/connector/odbc 下载connectors ODBC(选择适合自己系统的),然后安装
- windows:控制面板->管理工具->数据源(ODBC)->双击->添加->选中mysql ODBC driver–>输入数据库信息
使用:
library(RODBC) myconn <- odbcConnect("RData", uid="root", pwd="123456")
data1 <- sqlFetch(myconn, "news")
data2 <- sqlQuery(myconn, "select id,title,pubtime feom news")
close(myconn)
|
R的集成开发环境(IDE) - RStudio
RStudio使用C++开发,界面更加友好,功能更加强大。
我们先下载R,然后去官网下载免费版RStudio即可。
使用:
ctrl+s保存为.R
结尾的文件
run:

画图:
会在右下角plot显示,还可以对图进行导出保存
History:

R程序和默认工作空间:
Tools–>option–>General-> R version 和Default working directory
导入/保存工作空间:
Session -> load / save workspace
新建/打开工程:
Project下面
导入数据集:
Tools –> Import Dataset
如何画图
简单的图画例子
数据集:

画图:
dose = c(20,30,40,45,60) drugA = c(16,20,27,40,60) drugB = c(15,18,25,31,40) plot(dose, drugA, type = "b")
|

图形参数的修改
线条、符号、颜色:
opar = par(no.readonly=TRUE)
par(lty=2, pch=17)
plot(dose, drugA, type = "b")
par(opar)
plot(dose, drugA, type = "b", lty=6, pch=19, lwd=3, cex=2) help(plot)
col = rgb(25,155,60) ... plot(dose, drugA, type = "b", lty=6, pch=19, col="blue", col.axis="red", col.lab="green")
|


文本属性

dose = c(20,30,40,45,60) drugA = c(16,20,27,40,60) drugB = c(15,18,25,31,40)
plot(dose, drugA, type = "b", font.lab=3, cex.lab=1.5, font.main=2)
names(pdfFonts())
|
图形、边界尺寸

plot(dose, drugA, type = "b", lty=2, col="red",bg="green", main="药物A的反应曲线", sub="一个测试数据", xlab="剂量",ylab="病人的反应",xlim=c(0,60),ylim=c(0,70))
title(main="我的标题", col.main="red") title(sub="我的副标题", col.sub="green")
|
自定义坐标轴

y = c(1,10) x = y z = 10/x
opar = par(no.readonly=TRUE) par(mar=c(5,4,4,8)+0.1) plot(x,y, type = "b",pch=12,col="red", yaxt="n", lty=3,ann=FALSE)
axis(2, at=y, labels=x, col.axis="blue", las=2)
lines(x,z,type = "b",pch=12,col="green", lty=2) axis(4, at=z,labels=round(z,digits=2), col.axis="black", las=2,cex.axis=.7)
|
次要刻度线
install.packages("Hmisc") library(Hmisc)
plot(1:4, 1:4, type="b") minor.tick(nx=2,ny=3,tick.ratio=0.5)
|
参考线
abline(h=2, col="red", lty=2) abline(v=2.5, col="red", lty=1)
|
图例

opar = par(no.readonly=TRUE) par(lwd=2, cex=1.5, font.lab=2)
plot(dose, drugA, type="b",pch=15,col="red",lty=1, ylim=c(0,60), main="药物A和药物B的对比", xlab="剂量", ylab="药物反应")
lines(dose, drugB, type="b",pch=17,col="blue",lty=2)
minor.tick(nx=5,ny=2,tick.ratio=0.5)
legend("topleft", inset=.05, title="类型", legend("A","B"), lty=c(1,2),pch=c(15,17),col=c("red","blue"))
|
文本标注
想针对某个点进行标注的时候

attach(mtcars) plot(wt,mpg, main="车重和油耗关系", xlab="车重", xlab="油耗", pth=18,col="blue")
text(wt,mpg,row.names(mcars),cex=0.5, pos=4, col="red")
|
图形组合、图形布局的精细控制

图形组合:
attach(mtcars) opar <- par(no.readonly=TRUE)
par(mfrow=c(2,2))
plot(wt,mpg,main="wt vs mpg")
plot(wt,disp,main="wt vs disp")
hist(wt,main="Histogram of wt")
boxplot(wt,main="Boxplot of wt") par(opar) detach(mtcars)
layout(martrix(c(1,1,2,3)), 2,2, byrow=TRUE)
layout(martrix(c(1,1,2,3)), 2,2,width=c(3,1), height=c(1,2),byrow=TRUE)
|

图形精细控制:
par(fig(0, 0.8, 0, 0.8), new=TRUE)
|

R基本的数据管理
一个示例:

在数据框中创建新变量
mydada <- data.frame(x1=c(2,3,4,5), x2=c(2,5,7,9))
mydata$sumx <- mydata$x1 + mydata$x2
mydata$meanx <- (mydata$x1 + mydata$x2)/2
|
变量的重编码(把连续的数字变成某字符串)
survey <- data.frame(......) survey$age[survey$age == 99] <- Na
survey$age[survey$age > 75] <- "老年人"
survey$age[survey$age > 55 & survey$age < 75] <- "中年人"
|
变量的重命名
fix(survey)
names(survey)[6] <- "question1"
|
处理缺失值(NA)
x <- c(1,2,NA)
is.na(x) is.na(survey[,6:10])
which(is.na(A))
sum(is.na(A))
y <- sum(x, na.rm=TRUE)
data <- na.omit(survey)
|
日期值的使用
mydate <- as.Date("2022-04-14")
mydate1 <- c("04/14/2022", "04/13/2022") date <- as.Date(mydate1, "%m/%d/%Y")
today <- Sys.Date() format(today, format="%B %d %Y")
startdate <- as.Date("2022-01-02") enddate <- as.Date("2022-04-15") days <- enddate - startdate
|

数据类型的判断及转换
a <- c(2,5,7) is.numeric(a) is.vertor(a)
b <- as.character(a) is.numeric(b)
|

数据排序
data <- survey[order(survey$age),]
data <- survey[-order(survey$age),]
data2 <- survey[order(survey$gender, survey$age),]
|
数据集合并
x <- matrix(c(1,2,3,4,5,6,7,8,9), nrow=3, ncol=3) y <- x z <- cbind(x,y)
z1 <- merge(x,y, by="k1")
|
数据集子集的抽取
q <- survey[,6:10]
x <- survey[,-2]
newdata <- subset(surver, age>=35 | age<24, select=c(q1,q2,q3,q4))
|
随机抽样函数
sample(x, size, replace=FALSE)
mysample <- survey[sample(5,3,replace=FALSE),]
|
R的高级数据管理
数学函数
统计函数
x <- c(2,3,4,1,3,7,4,9,10)
mean(x)
sum(x)
n <- sum(x)/length(x)
sd(x)
var(x)
min(x) max(x)
scale(x)
|
概率函数:
x <- pretty(c(-3,3), 30) y <- dnorm(x) plot(y)
rnorm(50,mean=20, sd=8)
runif(5)
set.seed(12) runif(5)
|

字符处理函数
nchar("dddf")
substr("sahiu", 3,5)
grep("a", c("b","a","c","t"))
sub("a","A", "abcde")
strsplit("abcde", "c") strsplit("abcde", "")
paste("Thec", "Her is me.")
toupper("abc") tolower("ABC")
|
其他实用函数
length()
rep(1:3, 5)
cat("hello")
|
将之前的函数应用于矩阵和数据框中:
a <- c(1,2,4,5,6) round(a)
b <- matrix(runif(12), nrow=3) log(b) mean(b)
c <- matrix(rnorm(12), nrow=6, ncol=5) apply(c ,1, mean) apply(c ,2, mean)
|
重复和循环
循环:
for(i in 1:5) print("hello")
x <- 5 while(x > 0) {print("Hello"); x<- x-1}
|
条件执行:
if(x != 1) print("male") else print("female")
ifelse(条件, 语句1, 语句2)
felling <- c("sad", "glad", "afraid") for(i in felling) print(switch(i, glad = "我很开心", afraid = "害怕", sad="悲伤")
|
转置
cars <- mtcars[1:5, 1:4]
t(cars)
|
其他内容课余时间多学
R的基本图形
条形图
本节例子需要使用vcd
包进行演示,install.packages('vcd')
简单的条形图
barplot()
library(vcd)
barplot(c(1,2,4,6,2,7)) barplot(c(1,2,4,6,2,7), horiz=TRUE)
counts <- table(Arthritis$Improve) barplot(counts)
|
堆砌、分组条形图
绘制的数据不再仅仅是一个向量,而是矩阵
堆砌条形图:
counts <- table(Arthritis$Improve,Arthritis$Treatment) barplot(counts)
|

分组条形图:
barplot(counts, beside=TRUE)
|

均值条形图
head(state) states <- data.frame(state.region, state.x77) x <- aggregate(states$Illiteracy, by=list(state.region), FUN=mean)
barplot(x$x, names.arg=x$Group.1)
|

条形图的微调
par(mar=c(5,8,4,2)) counts <- table(Arthritis$Improve,Arthritis$Treatment) par(las=2)
barplot(counts, horiz=TRUE, cex.names=0.8, names.arg=c("没有治疗的","一些治疗的", "显著治疗的"))
|
饼图
饼图:
pie()
饼图缺陷:无法明确比较谁大谁小或相差多少
par(mfrow=c(2,2))
x <- c(10,12,4,16,8) lab <- c("国家1","国家2","国家3", "国家4", "国家5") pct <- rouund(x/sum(x)*100) labl <- c(lab, " ", "pct", %, sep=" ") # 自定义拼接制作标签
pie(x, labl, col=rainbow(length(labl)),main="简要饼图") # 指定名称, col=rainbow指定颜色
|
3D饼图
library(plotrix)
pie3D(x, labl, explode=0.1, main="3D饼图")
|
扇图: 扇图可以明确比较大小
fan.plot(x, labels=lab, main="扇图")
|

直方图
柱条组成的,特点:x轴上将值域分成等分的组
hist()
函数

hist(x, breaks=12, col="red", xlab="每英里加仑数")
|

hist(x, freq=FALSE, breaks=12, col="green", xlab="每英里加仑数")
rug(jitter(x))
lines(density(x), col="red", lwd=2)
|
核密度图
x轴展现是值,y轴是反映x轴值上密度的情况
可以很直观了解,比如不同条件下的变化情况
x <- density(mtcars$mpg)
plot(x)
|
描述4缸或6缸汽车不同的耗油量的对比:
attach(mtcars)
library(sm)
sm.density.compare(mpg, cyl, xlab="英里每加仑")
|

箱线图
分位数

箱线图元素:最小值、四分(之一)位数、中位数、四分(之三)为主、最大值、异常值
boxplot(mtcars$mpg, main="箱线图", ylab="公里每加仑")
boxplot(mpg~cyl, data=mtcars, main="箱线图", ylab="公里每加仑", xlab="汽缸数")
|

实例分析–预测海藻数量
预测海藻数量
1.问题描述与目标:

2.数据集的导入:

install.packages("DMwR2") library("DMwR2")
head(algae) summary(algae)
hist(algae$mxPH, prob=T, ylim=0:1) lines(density(algae$mxPH, na.rm=T))
|

3.数据预处理

查找缺失值:
algae[!complete.cases(algae), ]
manyNAs(algae) manyNAs(algae, 0.2)
|
缺失值的处理:
x <- algae y <- na.omit() y[!complete.case(y),] x <- algae[-c(62,199),] manyNAs(x)
symnum(cor(algae[,4:18], use="complete.obs")) x <- algae[-manyNAs(algae), ] lm(PO4~oPO4)
求距离值,把差值最小的依次排序,...
|
4.获取预测模型

x <- algae[-manyNAs(algae), ]
clean.algae <- knnImputation(algae,k=10) clean.algae
lm.a1 <- lm(a1 ~., data=clean.algae[, 1:12]) summary(lm.a1)
|

调整后的R的平方越接近1,就说明模型越科学

5.预测模型的调优:


lm2.a1 <- update(lm.a1, . ~. -season)
lm3.a1 <- update(lm1.a, . ~. -Chla)
anova(lm.a1, lm2.a1)
|

为了简化上述不断重复来减小误差,R提供了一个更加简便的函数:step()
final.lm <- step(lm.a1)
summary(final.lm)
|

熟能生巧,以后多利用R来处理生活中的简单问题!