R语言学习笔记
Tidyverse
dplyr包: 数据转换
数据和包载入
1 | library(nycflights13) |
基础函数
以下5个函数参数相同:
- 第一个参数为数据框;
- 随后参数使用变量名称(不带引号)描述操作;
- 返回一个新的数据框;
filter(): 按值筛选
基于筛选条件筛选出观测子集:
1 | subset <- filter(parentset, colname_1 == x_1, colname_2 == x_2) |
基于比较符
1 | subset <- filter(parentset, colname_1 >= x_1, colname_2 <= x_2) |
基于逻辑符
1 | subset <- filter(parentset, colname_1 >= x_1|colname_1 >= x_3)#或 |
缺失值
缺失值 : 称为NA(Not available,不可用)
对于缺失值的操作也都是缺失值(大多数情况);
1 | NA == NA |
在筛选器中,为NA值得行和条件为FALSE的行会被过滤,如果需要保留;
1 | subset <- filter(parentset,is.na(colname_1)|colname_1 >= x_3) |
其他NA特殊操作的值:
1 | NA^0 #=0 |
arrange(): 对行排序
1 | subset <- arrange(parentset, col_1, col_2, col_3) |
select(): 按名称选取
1 | subset <- select(parentset, col_1, col_2, col_3) |
辅助函数
1 | starts_with(str): #以str开头的名称 |
select可以重命名变量,但是会丢失其他变量:
1 | subset <- select(parentset, newname=oldname) |
使用select的变体可以保留其他变量
1 | rename(parentset, newname=oldname) |
也可以使用everything()函数进行列排序:
1 | subset <- select(parentset, col5,col3,everything()) |
one_of(character_1,···,character_n):如果某个列的名字出现在序列里,则选出它
mutate(): 使用函数创建新变量
1 | subset <- mutate(parentset, newcol1=col1/col2,newcol2=new1/col1) |
- 上述代码产生了两个新列, 总是加在数据框最后
- 新列按顺序产生, 列一经产生即可使用(new2使用了new1)
- 运算法则:
- 加减乘除 “+”, “-”,”*”,”/”,”^”
- 模运算:”%/%”整除,”%%”求余
- 对数:log(),log2(),log10();
- 偏移函数:lead(),lag(),前移或者后移一位
- 累加,滚动聚合: 累加和,积,最小值,最大值:cumsum(), cumprod(), cummin(),cummax()
1 | transmute(parentset, newcol1=col1/col2,newcol2=new1/col1) |
只保留新的变量;
summarize(): 摘要统计量
summarize(),它可以将数据框折叠成一行:
1 | summarize(flights, delay = mean(dep_delay, na.rm = TRUE)) |
group_by() 可以将分析单位从整个数据集更改为单个分组.
1 | by_day <- group_by(flights, year, month, day) |
管道操作符
即: “%>%”, 将返回值传递给管道符后的操作函数作为输入,通常可读作然后:
1 | delays <- flights %>% |
缺失值忽略参数
na.rm=TRUE参数可以在计算前除去缺失值;
计数参数
即n(), 它的值是操作单位中值的个数;
常见摘要函数
位置: median()和mean()
1 | not_cancelled %>% |
分散程度: sd(x)、IQR(x) 和mad(x)
分别是标准差, 四分位距, 绝对中位差;
1 | not_cancelled %>% |
秩: min(x)、quantile(x, 0.25) 和max(x)
1 | not_cancelled %>% |
定位度量:first(x)、nth(x, 2) 和last(x)
和索引取值的区别在于,当定位不存在时取默认值位置;
1 | not_cancelled %>% |
计数:count()
唯一值计数:
1 | n_distinct(); |
加权计数:
1 | count(df , wt= weight)#weight可以是其他列或者别的权重 |
逻辑值计数: sum(x>a)和mean(x==0)
sum()使用逻辑表达式计数可以计算true值的个数;
而mean则可以直接获得比例,因为true值为1,FALSE为0;
按多个变量分组
当使用多个变量进行分组时,每次的摘要统计会==用掉一个分组变量==。
1 | daily <- group_by(flights, year, month, day) |
- 但是取加权平均或者方差或者中位数时,很容易出错,因为对整体取中位数和分组取中位数在取中位数完全不同;
- 可以用ungroup()取消分组
tibble数据框
创建tibble数据框
1 | as_tibble(df)#从普通数据框转换 |
- tibble相比较data.frame: 不能改变输入的类型(例如,不能将字符串转换为因子)、变量的名称,也不能创建行名称。
- 可以在tibble 中使用在R 中无效的变量名称(即不符合语法的名称)作为列名,需要使用反引号` 将它们括起来
1 | tb <- tibble( |
- transposed tibble: 列标题由公式(以~ 开头)
定义,数据条目以逗号分隔,对少量数据进行布局
1 | tribble( |
打印tibble()
1 | tibble( |
取子集
1 | df <- tibble( |
readr
读取文件
- csv文件: read_csv()读取逗号分隔文件、read_csv2() 读取分号分隔文件(这在用, 表示小数位的国家非常普遍)、read_tsv() 读取制表符分隔文件、read_delim() 可以读取使用任意分隔符的文件。
- read_fwf() 读取固定宽度的文件。既可以使用fwf_widths() 函数按照宽度来设定域,也可以使用fwf_positions() 函数按照位置来设定域。read_table() 读取固定宽度文件的一种常用变体,其中使用空白字符来分隔各列。
参数
direction: 绝对or相对路径
1 | heights <- read_csv("data/heights.csv") |
skip = n:跳过前N行:
comment = char: 丢弃所有以char开头的行,即将其注释掉
col_names = FALSE: 不使用数据的第一行作为列名称(默认为TRUE. 标注为X1 X2 X3 ….;或者使用向量为其命名;
1 | read_csv("1,2,3\n4,5,6", col_names = c("x", "y", "z")) |
解析向量
- parse_*() 函数族: 接受一个字符向量,并返回一个特定向量,如逻辑、整数或日期向量:
1 | parse_integer(c("1", "231", ".", "456"), na = ".")#"na="哪些字符串应该当作缺失值来处理 |
解析失败的值在输出中是以缺失值的形式存在的
problems() 函数来获取完整的失败信息集合(tibble)
parse_double()解析浮点数,,parse_number() 则是灵活的数值型解析函数。
1 | parse_double("1,23", locale = locale(decimal_mark = ","))#“地区"根据地区设置解析选项 |
1 | #parse_number()忽略数值前后的非数值型字符 |
parse_character():
charToRaw()获得字符串ASCII编码
设定编码方式
1
2
3
4parse_character(x1, locale = locale(encoding = "Latin1"))
#> [1] "El Niño was particularly bad this year"
parse_character(x2, locale = locale(encoding = "Shift-JIS"))
#> [1] "こんにちは"未知编码方式:
1
2
3
4
5
6
7guess_encoding(charToRaw(x1))
#> encoding confidence
#> 1 ISO-8859-1 0.46
#> 2 ISO-8859-9 0.23
guess_encoding(charToRaw(x2))
#> encoding confidence
#> 1 KOI8-R 0.42
parse_factor(): R 使用因子表示取值范围是已知集合的分类变量。
1 | fruit <- c("apple", "banana") |
时间解析:
parse_datetime():
1
2parse_datetime("2010-10-01T2010")
#> [1] "2010-10-01 20:10:00 UTC"parse_date():
1
2parse_date("2010-10-01")
#> [1] "2010-10-01"parse_time():
1
2
3library(hms)
parse_time("20:10:01")
#> 20:10:01自定义格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25parse_date("01/02/15", "%m/%d/%y")
年
#%Y(4 位数)。
#%y(2 位数;00-69 → 2000-2069、70-99 → 1970-1999)。
月
#%m(2 位数)。
#%b(简写名称,如Jan)。
#%B(完整名称,如January)。
日
#%d(1 位或2 位数)。
#%e(2 位数)
时间
#%H(0-23 小时)。
#%I(0-12 小时,必须和%p 一起使用)。
#%p(表示a.m./p.m.)。
#%M(分钟)。
#%S(整数秒)。
#%OS(实数秒)。
#%Z(时区,America/Chicage 这样的名称)。注意,要当心缩写。如果你是美国人,注意
#EST 是加拿大没有夏时制的一个时区。它表#示东部标准时间!我们还会在12.5 节中继
#续讨论这个话题。
#%z(与国际标准时间的时差,如+0800)。
#非数值字符
#%.(跳过一个非数值字符)。
#%*(跳过所有非数值字符)。
解析文件
ggplot2
基础图画绘制
数据(Data)和映射(Mapping)
数据要求
用于绘制图形的data frame或者tibble.
映射
aes()函数是ggplot2中的映射函数, 所谓的映射即为数据集中的数据关联到相应的图形属性过程中一种对应关系, 图形的颜色,形状,分组等都可以通过通过数据集中的变量映射。
将钻石数据集中克拉和价格映射为X,Y轴变量:
1 | p <- ggplot(data = diamond, mapping = aes(x = carat, y = price)) |
#将钻石的颜色(color)映射颜色属性:
1 | p <- ggplot(data=diamond, mapping=aes(x=carat, y=price, shape=cut, colour=color)) |
#将钻石的切工(cut)映射到形状属性:
1 | p <- ggplot(data=diamond, mapping=aes(x=carat, y=price, shape=cut)) |
#将钻石的切工(cut)映射到分组属性:
1 | #默认分组设置, 即group=1p + geom_boxplot() |
几何对象(Geometric)
直方图
单变量连续变量:可绘制直方图展示,提供一个连续变量,画出数据的分布。
1 | ggplot(diamond)+geom_histogram(aes(x=price, fill=cut)) |
1 | ggplot(diamond)+geom_histogram(aes(x=price, fill=cut), position="dodge") |
1 | ggplot(diamond)+geom_histogram(aes(x=price, fill=cut), position="fill") |
柱状图
单变量分类变量:可使用柱状图展示,提供一个x分类变量,画出数据的分布。
1 | ggplot(diamond)+geom_bar(aes(x=clarity, fill=cut)) |
箱式图
箱线图: 通过绘制观测数据的五数总括,即最小值、下四分位数、中位数、上四分位数以及最大值,描述了变量值的分布情况。
1 | ggplot(diamond)+geom_boxplot(aes(x=cut, y=price,fill=color)) |
标尺(Scale)
在对图形属性进行映射之后,使用标尺可以控制这些属性的显示方式,比如坐标刻度,颜色属性等。
scale函数命名通式: 一般使用三个单词用”_”连接:
- 第一个都是scale
- 第二个是color fill x y linetype shape size等可更改的参数
- 第三个是具体的类型.
颜色标尺
第二个参数
对于颜色scale函数,第二个有两个参数, 一个是fill,主要是指填充颜色;另一个是color,指点或者线的颜色;
第三个参数
根据数据为离散型还是连续性决定;
1)离散型:在颜色变量是离散变量的时候使用,比如分类时每一类对应一种颜色
- manual 直接指定分组使用的颜色
- hue 通过改变色相(hue)饱和度(chroma)亮度(luminosity)来调整颜色
- brewer 使用ColorBrewer的颜色
- grey 使用不同程度的灰色
manual 参数:
1 | p+scale_fill_manual(values=c("red", "blue","green","yellow","orange")) |
brewer 使用ColorBrewer的颜色:
1 | library(RColorBrewer) |
direction参数决定颜色顺序, 为-1则反着来;
grey 使用不同程度的灰色:
通过start end 两个参数指定,0为黑,1为白,都在0-1范围内
1 | p + scale_fill_grey() |
2)连续型:颜色变量是连续变量的时候使用,比如0-100的数,数值越大颜色越深这样
- gradient 创建渐变色
- distiller 使用ColorBrewer的颜色
- identity 使用color变量对应的颜色,对离散型和连续型都有效
1 | df <- data.frame(x = runif(100),y = runif(100),z1 = rnorm(100)) |
gradient 创建渐变色#参数设定节点颜色:
1 | #设置两端颜色p + scale_color_gradient(low = "white", high = "black") |
distiller 使用ColorBrewer的颜色:
1 | p + scale_color_distiller(palette = "Spectral") |
坐标轴尺度修改
参数与上类似,第一个参数为scale, 然后是x,y表明对哪个轴操作,最后是详细操作;
- 更改坐标轴名称
- 更改x轴上标数的位置和内容
- 显示对一个轴做统计变换
- 只展示一个区域内的点
- 更改刻度标签的位置
1 | # 横坐标是离散变量,纵坐标是连续变量 |
1 | # 连续变量可以更改标度(图与上相似,略) |