R语言初步-数据转换-4.mutate()函数

R语言学习笔记总结

R语言初步-用dplyr进行数据转换

install.packages("tidyverse")
install.packages("nycflights13")#仍然记得要先安装
library(nycflights13)#航班信息文件
library(tidyverse)

?flights#查看数据信息的说明书
flights#查看航班信息

4.使用mutate()函数添加新变量

mutate:变异 ; 突变 ; 改变 ; 数据修改

除了选择现有的列,也可以自己添加新的列,新的列是已有列的函数。
提示:如果数据列数太多,使用view()函数可以在Rstudio里看到所有的列
为了方便,我们可以先创建一个列数少的数据框,比如使用之前讲过的select()函数:

narrow_data <- select(flights,year:day,ends_with("delay"),distance,air_time)
> narrow_data
#运行后查看创建的narrow_data

# A tibble: 336,776 x 7
    year month   day dep_delay arr_delay distance air_time
   <int> <int> <int>     <dbl>     <dbl>    <dbl>    <dbl>
 1  2013     1     1         2        11     1400      227
 2  2013     1     1         4        20     1416      227
 3  2013     1     1         2        33     1089      160
 4  2013     1     1        -1       -18     1576      183
 5  2013     1     1        -6       -25      762      116
 6  2013     1     1        -4        12      719      150
 7  2013     1     1        -5        19     1065      158
 8  2013     1     1        -3       -14      229       53
 9  2013     1     1        -3        -8      944      140
10  2013     1     1        -2         8      733      138
# ... with 336,766 more rows

紧接着创建新的列gain和speed

mutate(narrow_data,gain=arr_delay-dep_delay ,speed=distance/air_time*60)
# A tibble: 336,776 x 9
    year month   day dep_delay arr_delay distance air_time  gain speed
   <int> <int> <int>     <dbl>     <dbl>    <dbl>    <dbl> <dbl> <dbl>
 1  2013     1     1         2        11     1400      227     9  370.
 2  2013     1     1         4        20     1416      227    16  374.
 3  2013     1     1         2        33     1089      160    31  408.
 4  2013     1     1        -1       -18     1576      183   -17  517.
 5  2013     1     1        -6       -25      762      116   -19  394.
 6  2013     1     1        -4        12      719      150    16  288.
 7  2013     1     1        -5        19     1065      158    24  404.
 8  2013     1     1        -3       -14      229       53   -11  259.
 9  2013     1     1        -3        -8      944      140    -5  405.
10  2013     1     1        -2         8      733      138    10  319.
# ... with 336,766 more rows

新创建的列同时也可以使用(但是保留的方法仍然是赋值给某个名称):

 mutate(narrow_data,
        gain=arr_delay-dep_delay,
        hours=air_time/60,
        gain_per_hour=gain/hours)
# A tibble: 336,776 x 10
    year month   day dep_delay arr_delay distance air_time  gain hours
   <int> <int> <int>     <dbl>     <dbl>    <dbl>    <dbl> <dbl> <dbl>
 1  2013     1     1         2        11     1400      227     9 3.78 
 2  2013     1     1         4        20     1416      227    16 3.78 
 3  2013     1     1         2        33     1089      160    31 2.67 
 4  2013     1     1        -1       -18     1576      183   -17 3.05 
 5  2013     1     1        -6       -25      762      116   -19 1.93 
 6  2013     1     1        -4        12      719      150    16 2.5  
 7  2013     1     1        -5        19     1065      158    24 2.63 
 8  2013     1     1        -3       -14      229       53   -11 0.883
 9  2013     1     1        -3        -8      944      140    -5 2.33 
10  2013     1     1        -2         8      733      138    10 2.3  
# ... with 336,766 more rows, and 1 more variable: gain_per_hour <dbl>

由于系统显示限制,最后一列没有展示出来,运行view()函数即可:

示例:
view(mutate(narrow_data,
            gain=arr_delay-dep_delay,
            hours=air_time/60,
            gain_per_hour=gain/hours
            )
     )
#运行后系统加载完整的数据表

如果只想要保留新的变量,那就使用transmute()函数:

transmute(narrow_data,
          gain=arr_delay-dep_delay,
          hours=air_time/60,
          gain_per_hour=gain/hours
          )
#运行后:
# A tibble: 336,776 x 3
    gain hours gain_per_hour
   <dbl> <dbl>         <dbl>
 1     9 3.78           2.38
 2    16 3.78           4.23
 3    31 2.67          11.6 
 4   -17 3.05          -5.57
 5   -19 1.93          -9.83
 6    16 2.5            6.4 
 7    24 2.63           9.11
 8   -11 0.883        -12.5 
 9    -5 2.33          -2.14
10    10 2.3            4.35
# ... with 336,766 more rows

此时参与计算的arr_delay、dep_delay、air_time、hours都消失,只有新转换的gain、hours 、gain_per_hour三列。


mutare()函数可以和前面提到的几个函数结合起来使用。其中进行运算的时候,肯定会涉及到R语言的计算语言,以下列出几个常用的:

  • +、—、*、/基本运算
  • sum()计算总和
  • mean()计算均值
  • log(),log2(),log10()
  • %/% 整数除法
  • %% 求余
  • x==y*(x%/% y)+(x%%y) 一个拆分整数的常用表达

举例:

transmute(flights,
          dep_time,
          hour=dep_time%/%60,    #计算了dep_time的小时数量
          minute=dep_time%%60    #计算了dep_time的分钟数量
          )
#运行:
# A tibble: 336,776 x 3
   dep_time  hour minute
      <int> <dbl>  <dbl>
 1      517     8     37
 2      533     8     53
 3      542     9      2
 4      544     9      4
 5      554     9     14
 6      554     9     14
 7      555     9     15
 8      557     9     17
 9      557     9     17
10      558     9     18
# ... with 336,766 more rows
  • lag()和lead() 返回一个序列的领先值和滞后值
  • cumsum()和cumprod() 累加和、累加积
  • cummin()、cummax()、cummean() 累加最小值、累加最大值、计算累加均值
 (x <- 1:10)
 [1]  1  2  3  4  5  6  7  8  9 10
 lag(x)
 #运行:
 [1] NA  1  2  3  4  5  6  7  8  9
 lead(x)
 #运行:
 [1]  2  3  4  5  6  7  8  9 10 NA
 cumsum(x)
 #运行:
 [1]  1  3  6 10 15 21 28 36 45 55
 cumprod(x)
 #运行:
 [1]       1       2       6      24     120     720    5040   40320  362880 3628800
 cummin(x)
 #运行:
 [1] 1 1 1 1 1 1 1 1 1 1
 cummax(x)
 #运行:
 [1]  1  2  3  4  5  6  7  8  9 10
 cummean(x)
 #运行:
 [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5
  • <、<=、>、>=、!= 逻辑比较
  • log(),log2(),log10()
  • min_rank() 排序函数,用于最常规的排秩
  • min_rank(desc())则是倒序排秩
    注意!min_rank() 是给出每个数据的排名,而不是把数据本身从大到小排列!
  • row_number()、dense_rank()、percent_rank()、cume_dist()、ntile()等等
y <- c(1,4,6,3,8,4,5,0)
min_rank(y) 
#运行:
[1] 2 4 7 3 8 4 6 1
min_rank(desc(y)) 
#运行:
[1] 7 4 2 6 1 4 3 8
min_rank(y) 
#运行:
[1] 2 4 7 3 8 4 6 1
row_number(y)
#运行:
[1] 2 4 7 3 8 5 6 1
dense_rank(y)
#运行:
[1] 2 4 6 3 7 4 5 1
percent_rank(y)
#运行:
[1] 0.1428571 0.4285714 0.8571429 0.2857143 1.0000000 0.4285714 0.7142857 0.0000000
cume_dist(y)
#运行:
[1] 0.250 0.625 0.875 0.375 1.000 0.625 0.750 0.125
ntile(y)
#运行:
Error in ntile(y) : argument "n" is missing, with no default
ntile(y,3)
#运行:
[1] 1 2 3 1 3 2 2 1

函数众多,可以自己在系统中查看帮助文档:

help(ntile)
help(cume_dist)
#运行后系统自动展示函数的基本说明

注意:进行复杂的运算时,形成立刻赋值给新变量的好习惯,便于检查

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355

推荐阅读更多精彩内容