R for Data Science
准备包和示例数据
library(dplyr)
library(nycflights13)
mutate()函数 基本用法
# 作用是添加新列,新列是由原有数据计算的来
# 添加的新列在数据集的最后
# 举例
flights_sml <- select(flights,year:day,ends_with("delay"),distance,air_time)
mutate(flights_sml,
gain=arr_delay-dep_delay,
speed=distance/air_time*60)
# 第二个及后面的参数是新列的名称以及运算方式,运算数据则是源于先前的列
# 会返回添加新列后的数据框,但是右侧environment里面的数据框并没有发生改变
# 如果想让改变保存,就需要赋值
# 一旦创建,新列就可以直接使用
mutate(flights_sml,
gain=arr_delay-dep_delay,
hours=air_time/60,
gain_per_hour=gain/hours)
# 如果你只要新列的数据返回
# 那么可以用transmute()函数
transmute(flights,
gain=arr_delay-dep_delay,
hours=air_time/60,
gain_per_hour=gain/hours)
创建新变量有多种函数,可以和mutate()
搭配使用
创建新变量的函数必须遵循:输入和输出皆为向量,并且输入与输出的向量具有同样数目的分量
算术运算
# 运算符号: +; -; *; /; ^;
# 遵循“循环法则”,即如果一个参数比另一个参数短,那么前者会自动循环扩充至同样的长度
# 算数运算常与聚集函数结合
# 例如
# x / sum(x) 计算各部分在总数中的比例;
# y - mean(y) 计算各部分与均值之间的差
模运算
# %/% 整数除法
# %% 求余数除法
# 即 x == y * (x %/% y) + (x %% y)
# 模运算的作用是拆分整数
# 例如:计算dep_time的hour和minute
transmute(flights,
dep_time,
hour=dep_time %/% 100,
minute=dep_time %% 100)
对数函数
# 但你要处理横跨多个数量级的数据时
# 取对数是非常有用的,将一个数量级转为对数标度的一个单位
# 常用 log() log2() log10()
偏移函数
# lead() 返回一个序列的领先值
# lag() 返回一个序列的滞后值
# 与group_by()结合非常有用
累加和滚动聚合
# 累加和
cumsum()
# 累加积
cumprod()
# 累加最小值
cummin()
# 累加最大值
?cummax()
# 累加均值
cummean()
x <- 1:10
cumsum(x)
cumprod(x)
cummin(c(3:1, 2:0, 4:2))
cummax(c(3:1, 2:0, 4:2))
# 如果想计算滚动聚合(即滚动窗口求和),那么可以尝试RccpRoll包
逻辑比较
# 逻辑运算符:< <= > >= !=
# 如果需要进行一系列复杂的运算,那么最好把中间结果保存在新变量中
# 这样方便检查是否每一步都符合预期
排秩
# 排秩函数有很多
# 以最简单且常用的min_rank()为例
# 默认的排秩方式是:最小的值获得最前面的名次
# 使用desc(x)使最大值获得前面的名次
y<-c(1,2,2,NA,3,4)
min_rank(y) # 1 2 2 NA 4 5
min_rank(desc(y)) # 5 3 3 NA 2 1
# min_rank()的变体:
# row_number()
# dense_rank()
# percent_rank()
# cume_dist()
# ntile()
mutute()练习题
# 将dep_time、sched_dep_time转为方便阅读表达形式,例如从午夜开始的分钟数
transmute(flights,
dep_hour = dep_time %/% 100,
dep_min = dep_time %% 100,
dep_hour_min = paste0(dep_hour,":",dep_min)) # 另一个同理
# 比较 air_time arr_time - dep_time
transmute(flights,
air_time,
travel_time=arr_time - dep_time)
# 可以发现旅途时间大于空中时间,可能因为起飞降落都比较耗时,或者中间有换乘
# 比较dep_time、sched_dep_time和dep_delay,这三个数值之间具有何种关系
transmute(flights,
dep_time,
sched_dep_time,
dep_delay)
# sched_dep_time + dep_delay == dep_time
# 用排秩函数找出10个延误时间最长的航班
flights_late<-mutate(flights,
late = min_rank(desc(arr_delay)))
flights_late <- arrange(flights_late,late)
select(flights_late,tailnum,arr_delay,late,everything())
# 1:3 + 1:10 会返回什么,为什么
1:3 + 1:10 # 2 4 6 5 7 9 8 10 12 11
# 因为算术运算会循环补齐
# R提供了哪些三角函数
sin()
cos()
tan()
# 反三角函数
asin()
acos()
atan()
因为模运算和迁移函数那块我也没懂,所以没怎么拓展