Iretara 12-17 21:18
以例题的形式简述R语言基础知识
# 读取文件
setwd(" 文件链接的时候,用 / ")
install.packages(" readxl ")
library(readxl)
library (tidyverse)
hw1_a<- read_excel ("hw1_a.xlsx", col_types=c("numeric", "numeric", "numeric", "numeric", "numeric") )
hw1_b<- read_excel ("hw1_b.xlsx")
#读取csv
library(readr)
hw1_a<- read_csv ("/")
View(hw1_a)
# 描述型函数
hw1_a + hw1_b 表
#描述最小值,最大值,中值,均值,标准差
summary (hw1_a) #指出各个变量的形式, 最小值,最大值,中值,均值
library(psych)
describe (hw1_a) #比summary更简便的方法, 可以直接读取标准差等;但是,使用describe不可读取 NA值, 可以尝试使用 Hmisc包中 describe
描述型函数-R
# 连接
hw1_a %>% inner_join (hw1_b, by ="ID")
hw1_a %>% left_join (hw1_b, by ="ID")
hw1_a %>% right_join (hw1_b, by ="ID")
hw1_a %>% full_join (hw1_b, by ="ID")
inner_join<- inner_join (hw1_a,hw1_b, by =“ID”) #报告合并后的 总行数 ,178行
full_join<- full_join (hw1_a,hw1_b, by ="ID")
( nrow (full_join)) #报告合并后的 总行数 ,200行
> length (full_join$ID)
#找出各个列的 缺失值
i<-NA
a<-NA
for(i in 1:length(full_join[1,])){ a[i]<- sum(is.na( full_join[,i] ) ) }
paste("缺失值是",a)
#缺失值总数
sum(is.na(full_join))
#删除缺失值 na.omit()
full_join1=filter(full_join,!is.na(full_join[2]))
full_join1=filter(full_join1,!is.na(full_join1[3]))
full_join1=filter(full_join1,!is.na(full_join1[4]))
full_join1=filter(full_join1,!is.na(full_join1[5]))
full_join1=filter(full_join1,!is.na(full_join1[6]))
full_join1=filter(full_join1,!is.na(full_join1[7]))
full_join1=filter(full_join1,!is.na(full_join1[8]))
sum(is.na(full_join1))
找出Income中的 极端值 并滤掉对应行的数据
quantile (hw1_a$Income,c(0.025,0.975))
hw1_a2= filter (hw1_a,Income>14168.81 &Income<173030.92)
#使用dplyr进行数据转换
arrange()
>arrange (hw1_a,Income) #默认升序
>arrange(hw1_a, desc (Income)) #desc降序,NA排序一般最后
select()
>select (hw1_a, - (Years_at_Address:Income)) #不要变量
>rename (hw1_a, In_come=Income) #改名
>select(hw1_a,Income, exerything ()) #把Income放在前面
拓例题1:
library(nycflights13)
view(flights)
#counts
(1)
not_cancelled <- flights %>%
filter(! is.na(dep_delay), !is.na(arr_delay))
(2)
not_cancelled %>%
group_by (year,month,day) %>%
summarize (mean=mean(dep_delay))
(3)
delays <- not_cancelled %>%
group_by (tailnum) %>%
summarize (delay=mean(arr_delay))
ggplot (data=delays,mapping=aes(x= delay))+
geom_freqpoly (binwidth=10) #freqpoly
(4)
delays <- not_cancelled %>%
group_by(tailnum) %>%
summarize(delay=mean(arr_delay,na.rm=TRUE), n=n() ) #tailnum的次数
ggplot(data=delays,mapping=aes(x= n, y=delay))+
geom_point(alpha=1/10)
拓例题2:
#请按照价格的均值,产生新的变量price_new, 低于均值为“低价格”,高于均值为“高价格”。 同样对市场份额也是,产生变量marketshare_new, 数值为“低市场份额”和“高市场份额”
price=data1$price
pricebar=mean(price)
price_new= ifelse (price>pricebar,“高价格”,”低价格”)
marketshare=data1$marketshare
marketsharebar=mean(marketshare)
marketshare_new=ifelse(marketshare>marketsharebar ,“高市场份额”,”低市场份额”)
data1= mutate (data1,price_new,marketshare_new)
#可视化
#将Income 对数化
lninc<- log (hw1_a$Income)
#画出直方图和 density curve密度曲线
hist (lninc,prob=T)
lines ( density (lninc),col="blue")
# 添加额外变量 的办法,在 aes()中添加 样式 (color、size、alpha、shape)
ggplot(data=inner_join)+
geom_point(mapping = aes(x=Years_at_Employer,y= Income, alpha= Is_Default))
# 按照Is_Default 增加一个维度,使用明暗程度作为区分方式
ggplot(data=inner_join)+
geom_point(mapping = aes(x=Years_at_Employer,y= Income,
alpha=factor( Is_Default ) ))
#使用形状作为另外一种区分方式
ggplot(data=inner_join)+
geom_point(mapping = aes(x=Years_at_Employer,y= Income,
shape=factor( Is_Default)))
可视化-R
拓展:
#将 flight1 表和 weather1 表根据共同变量进行内连接,随机抽取 100000 行数据, 将生产的结果保存为 flight_weather。 (提示:sample_n()函数,不用重复抽取)
flight_weather <- inner_join(flight1, weather1) %>% sample_n(100000)
# 从 flight_weather表中对三个出发机场按照平均出发延误时间排降序,并将结果保留在 longest_delay表中。把结果展示出来
longest_delay<- flight_weather %>%
group_by(origin) %>%
summarize(delay=mean(dep_delay, na.rm=TRUE )) %>%
arrange(desc(delay))
#根据不同出发地(origin)在平行的 3 个图中画出风速 wind_speed(x 轴)和出发 延误时间 dep_delay(y 轴)的散点图。
ggplot(data= flight_weather) +
geom_point(mapping=aes(x=wind_speed,y=dep_delay))+
facet_grid(.~origin, nrow = 3 ) # 按照class分类,分成3行
#根据 flight_weather 表,画出每个月航班数的直方分布图,x 轴为月份,y 轴是每个 月份航班数所占的比例。
ggplot(data=flight_weather)+
geom_bar(mapping=aes(x=month, y=..prop .., group=1))
#根据 flight_weather 表,画出每个月航班距离的 boxplot 图,x 轴为月份,y 轴为 航行距离, 根据的航行距离的中位数从低到高对 x 轴的月份进行重新排序
ggplot(data=flight_weather)+
geom_boxplot(mapping=aes(x= reorder (month,distance,FUN=median),y=distance))
线性回归
# 以Income作为因变量,Years at Employer作为自变量,进行 OLS回归
m1<- lm (Income ~ Years_at_Employer,data=hw1_a)
#通过***判断显著性
summary (m1)
#画出拟合直线
ggplot(data= hw1_a)+
geom_point(aes(x=Income,y=Years_at_Employer))+
geom_abline(data= m1,col= "blue")
#证明拟合直线是最优的
b0=runif(20000,-5,5)
b1=runif(20000,-5,5)
d<-NA
sum<-NA
n<-1
while(n<=20000){
for(i in 1:24){
d[i]<-(hw1_a $ Income[i]-b0[n]-b1[n]*hw2$ Years_at_Employer[i])^2}
sum[n]<-sum(d)
n<-n+1
}
resi=m1$residuals
resi2=sum(resi^2)
check=sum(as.numeric(sum<resi2))
check
向量是 R 语言中最基本的数据类型,在 R 中没有单独的标量(例如 1 本质上是 c(1)) 。
R 中可以用 = 或者 <- 来进行赋值 , <-的快捷键是 alt + - 。
R的下标是从1开始的,和python等不同(python四从0开始的)
当然我们也可以用逻辑进行筛选,例如
负数下标表示不选这个这些下标,例如:
c() 可以合并向量,例如
向量有个比较有趣的性质,当两个向量进行操作时,如果长度不等, 长度比较短的一个会复制自己直到自己和长的一样长。
a 自动变成了 c(3,4,3,4) 然后与b相加 , 得到了下面的结果。
遇到不懂得函数,可以用help("函数")查看函数用法。
矩阵,从本质上来说就是多维的向量,我们来看一看 我们如何新建一个矩阵。
可以看到向量元素变为矩阵元素的方式是按列的,从第一列 到第二列,如果我们想按行输入元素,那么需要加入 byrow = TRUE 的参数:
与向量相似,我们可以用下标来筛选矩阵, 例如:
a[行,列]
当我们对两个矩阵相乘,我们得到的结果是 对应元素两两相乘的结果,例如:
而这不是我们想要的矩阵乘法,在 R 中我们在乘法旁边加两个 百分号来做矩阵乘法:
此外,我们可以用 t() 来求矩阵的转置 , 用 solve() 来求矩阵的逆。
数据框类似矩阵,与矩阵不同的是,数据框可以有不同的数据类型。 一般做数据分析,我们把一个类似 excel 的表格读入 R ,默认的格式 就是数据框 , 可见数据框是一个非常重要的数据结构。
一般来说我们需要分析的数据,每一行代表一个样本,每一列代表一个 变量。
下面我们用 R 内置的数据集 iris 来看一看数据框的使用。
我们用 data 函数调入了 iris 这个数据集 , 然后用 head 函数来看一看这个数据 的前几行 , 可以看到有 sepal 的长度,宽度,petal 的长度和宽度,还有一个变量 Species 来描述样本的类别。
我们可以用 summary 函数来对数据集做大致的了解。
可以直观地看到每个变量的信息,对于几个数值变量,我们可以看到最小值,中位数等等统计信息。而对于 Species 这个分类变量,我们看到的是计数信息。
筛选数据框与矩阵相似,都可以通过数字下标来获取子集,不同地是因为数据框有不同的列名,我们也可以通过列名来获取某一特定列,例如:
我们可以用 names() 函数来获取数据框的列名
并可以通过为其赋值改变列的名字。
列表是一种递归式的向量,我们可以用列表来存储不同类型的数据,比如:
列表有多种索引方式,可以用如下方式获取。
今天我们实验的对象就是一组从原始 R 进化出来的工具链 Tidyverse , 它是由 Hadley Wickham 主导开发的一系列 R 包的集合。 Tidyverse 继承了R语言进行快速统计分析的优势 , 并实现了一些新的理念 , 例如 magrittr 包中的管道操作 , 让线性嵌套的函数组合变得更加清晰易懂;可视化方面中的 ggplot ,使绘图变成搭积木式的图层叠加。
这样的小发明有的改变了分析的运作方式 , 有的改变了使用者的认知方式 , 聚在一起形成了一种新的数据分析的生态链 。具体来看 , Tidyverse 有如下核心组件:
mpg 数据集是刻画不同汽车的排放状况的一个数据集, 总过有 234 个样本 , 11 个变量 。 这 11 个变量分别是:
manufacture: 制造商
model: 车型
dispel: 汽车排放量
year: 制造年度
cyl: 排气管数量
trans: 排放类型
drv: 驱动方式
cty: 每公里耗油量(城市道路)
hwy: 每公里耗油量(高速路)
fl: 油的种类
class: 车的类型
更多数据相关信息可以通过 help(mpg) 指令获取。
在属性映射中加入 color=class 参数后 , 我们可以看到每个点的汽车对应的类型被用 不同颜色表现了出来 , 对于散点图 , 还有 size(大小) , shape(形状) 等等参数 可以用于确定点的属性。
对于条形图的y轴就是数据框中原本的数值时,必须将geom_bar()函数中stat(统计转换)参数设置为’identity’,即对原始数据集不作任何统计变换,而该参数的默认值为’count’,即观测数量。
R 有几种用于制作图形的系统,但 ggplot2 是最优雅和最通用的系统之一。与大多数其他图形包不同,ggplot2 具有基于图形语法的底层语法,它允许您通过组合独立组件来组合图形。如果想要更加了解ggplot2,请阅读 ggplot2: Elegant Graphics for Data Analysis ,可以从 https://ggplot2-book.org/getting-started.html 学习本书
所有的图都由数据data,想要可视化的信息,映射mapping(即数据变量如何映射到美学属性的描述)组成
1. 图层(layers) 是几何元素和统计变换的集合。几何对象,简称 geoms ,代表你在图中实际看到的东西:点、线、多边形等等。 统计转换,简称 stats ,总结数据:例如,装箱和计数观察,以创建一个直方图,或拟合一个线性模型。
2. Scales 将数据空间中的值映射到美学空间中的值。这包括颜色、形状和大小的使用。Scale还绘制图例和轴,这使得从图中读取原始数据值成为可能(反向映射)。
3. 坐标(coords) 或坐标系统描述如何将数据坐标映射到图形的平面。它还提供了轴和网格线来帮助读取图形。我们通常使用笛卡尔坐标系,但也可以使用其他一些坐标系,包括极坐标和地图投影。
4. 刻面(facet) 指定如何拆分数据子集并将其显示为小倍数。这也被称为条件反射或网格/格子。
5. theme 控制更精细的显示点,如字体大小和背景颜色。
ggplot2有许多参数,可根据需求自行选取,具体参数详情可见 https://ggplot2.tidyverse.org/reference/index.html
基础绘图:由 ggplot(data,aes(x,y))+geom_ 开始,至少包含这三个组件,可以通过"+"不断的添加layers, scales, coords和facets。
Geoms :几何对象,通常,您将使用geom_函数创建层,以下为常用的图形:
geom_bar() :直方图,条形图
geom_boxplot() :box图
geom_density() :平滑密度估计曲线
geom_dotplot() :点图
geom_point() :点图
geom_violin() :小提琴图
aes(),颜色、大小、形状和其他审美属性
要向绘图添加其他变量,我们可以使用其他美学,如颜色、形状和大小。
按照属性定义
它们的工作方式与 x 和 y 相同,aes():
aes(displ, hwy, colour = class) #按照某个属性着色
aes(displ, hwy, shape = drv) #按照某个属性定义
aes(displ, hwy, size = cyl) #按照某个属性定义
整体自定义
geom_xxx(colour =自定义颜色)
geom_xxx(shape=形状编号)
geom_xxx(size =编号大小定义 0-10)
注意根据需求按照aes()还是geom进行添加属性
以下为R语言中各shape形状编号
scale控制如何将数据值转换为视觉属性的细节。
labs()和lims() 是对标签和限制进行最常见调整。
labs() ,主要对图形进行调整,注释等
labs()括号内参数:title主标题,subtitle副标题,caption右下角描述,tag左上角
xlab() ,x轴命名
ylab() ,y轴命名
ggtitle() ,标题
lims()
xlim() , xlim(a,b) 限制坐标(a,b)
ylim() , ylim(a,b) 限制坐标(a,b)
scale_alpha() 透明度尺度
scale_shape() , 搭配aes(shape=某个属性)使用
参数:name ,solid =T/F是否填充
scale_size()搭配aes(size=某个属性)使用
参数:name,range =c(0, 10)
1.适用于发散和定性的数据
a. scale_colour_brewer() ,scale_colour_brewer(palette =" "),scale_colour_brewer(palette ="Green ")
palette来自RcolorBrewer包,所有面板:
b. scale_colour_manual()
scale_colour_manual(values=c( )) 可以 自定义颜色 ,常用的参数
values可直接定义颜色,但是建议使用命名向量,例如
values=c("8" = "red", "4" = "blue", "6" = "darkgreen", "10" = "orange")
PS:注意在aes(colour=factor()),一定要把因素转换为factor型,否则无效
2.适用于连续的值,渐变颜色
a. scale_colour_gradient()
scale_colour_gradient (low =" ",high=" "),根据值大小定义颜色,创建两个颜色梯度(低-高),
b. scale_colour_gradient2()
scale_colour_gradient2(low = " ",mid = " ",high = " ")创建一个发散的颜色梯度(低-中-高)
c. scale_colour_gradientn()
创建一个n色渐变,scale_colour_gradientn(colours =许多R语言中的颜色面板),
默认坐标系是笛卡尔 coord_cartesian()
一般不会修改
facet_grid() ,在网格中布置面板
facet_grid(rows = vars() ) cols或rows = vars(因素),图形按列或行分割
facet_wrap()
facet_wrap(vars( ), ncol =n) , ncol或者nrow,分为多少行多少列
theme_bw() ,可以覆盖所有主题,背景变为白色,我们在文章中所用的图片大都需要该背景。
或者用 theme_classic() ,同时去除了网格线
theme() ,修改主题的组件,里面涉及多个参数,根据需求调整
常见参数:
legend.position,图例的位置,包括 "left" 左, "right" 右, "bottom" 下, "top" 上和"none",不显示