生信小白菜之关于mutate函数的一切

本文详细介绍了如何在R语言中使用dplyr包中的mutate()和transmute()函数创建新列,包括算术运算、模运算、对数函数、偏移函数以及逻辑比较等技巧,通过nycflights13数据集进行实例演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()

因为模运算和迁移函数那块我也没懂,所以没怎么拓展

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值