R语言基础入门(4) mutate函数创建新列

今天继续介绍dplyr包中的重要函数mutate,其基本功能为创建新列;mutate中的选项几乎是无穷无尽的,可以通过各种函数之间的组合来对数据集做任意的处理,下面通过具体的案例来进行演示

这次我们使用R内置的数据集msleep,其中包括哺乳动物的睡眠时间。让我们首先加载包并查看数据:

library(tidyverse)
msleep
   name    genus  vore  order conservation sleep_total sleep_rem sleep_cycle
   <chr>   <chr>  <chr> <chr> <chr>              <dbl>     <dbl>       <dbl>
 1 Cheetah Acino~ carni Carn~ lc                  12.1      NA        NA    
 2 Owl mo~ Aotus  omni  Prim~ NA                  17         1.8      NA    
 3 Mounta~ Aplod~ herbi Rode~ nt                  14.4       2.4      NA    
 4 Greate~ Blari~ omni  Sori~ lc                  14.9       2.3       0.133

mutate 基础操作

最简单的的操作就是根据其他列中的值进行计算。在示例代码中,我们将睡眠数据从以小时为单位更改为分钟为单位

msleep %>%
  select(name,sleep_total) %>%
  mutate(sleep_total_min = sleep_total * 60)
   name                       sleep_total sleep_total_min
   <chr>                            <dbl>           <dbl>
 1 Cheetah                           12.1             726
 2 Owl monkey                        17              1020
 3 Mountain beaver                   14.4             864

下列代码创建了两列新列:一列显示了睡眠时间与平均睡眠时间的差异,另一列显示了与睡眠时间最少的动物之间的差异;round( )对数据进行四舍五入操作

msleep %>%
  select(name, sleep_total) %>%
  mutate(AVG = sleep_total - round(mean(sleep_total), 1),
         MIN = sleep_total - min(sleep_total))
# A tibble: 83 x 4
   name                       sleep_total    AVG   MIN
   <chr>                            <dbl>  <dbl> <dbl>
 1 Cheetah                           12.1  1.7    10.2
 2 Owl monkey                        17    6.6    15.1
 3 Mountain beaver                   14.4  4      12.5

选择特定列按行求均值,rowwise( )说明按行进行操作

msleep %>%
  select(name, contains("sleep")) %>%
  rowwise() %>%
  mutate(avg = mean(c(sleep_rem,sleep_cycle)))
  name                sleep_total sleep_rem sleep_cycle    avg
   <chr>                     <dbl>     <dbl>       <dbl>  <dbl>
 1 Cheetah                    12.1      NA        NA     NA    
 2 Owl monkey                 17         1.8      NA     NA    
 3 Mountain beaver            14.4       2.4      NA     NA    
 4 Greater short-tail~        14.9       2.3       0.133  1.22 

通过ifelse判断语句对数据进行操作,如果brainwt > 4返回NA,不满足此条件返回原值

msleep %>%
  select(name, brainwt) %>%
  mutate(brainwt2 = ifelse(brainwt > 4, NA, brainwt)) %>%
  arrange(desc(brainwt))
   name             brainwt brainwt2
   <chr>              <dbl>    <dbl>
 1 African elephant   5.71    NA    
 2 Asian elephant     4.60    NA    
 3 Human              1.32     1.32 
 4 Horse              0.655    0.655

也可以结合使用stringr的功能或正则表达式来对字符串列进行操作;
示例代码将返回动物名称的最后一个单词,并使其小写

msleep %>%
  select(name) %>%
  mutate(name_last_word = tolower(str_extract(name, pattern = "\\w+$")))
   name                       name_last_word
   <chr>                      <chr>         
 1 Cheetah                    cheetah       
 2 Owl monkey                 monkey        
 3 Mountain beaver            beaver        

对多列同时进行操作

  • mutate_all() 将对所有列进行操作
  • mutate_if()首先需要一个返回布尔值,如果是T,则将在这些变量上执行mutate指令
  • mutate_at()要求在vars() 参数内指定要进行改变的列

将所有数据转换为小写:

msleep %>% mutate_all(tolower)
   name    genus vore  order conservation sleep_total sleep_rem
   <chr>   <chr> <chr> <chr> <chr>        <chr>       <chr>    
 1 cheetah acin~ carni carn~ lc           12.1        NA       
 2 owl mo~ aotus omni  prim~ NA           17          1.8      
 3 mounta~ aplo~ herbi rode~ nt           14.4        2.4      

所有列添加" /n "

msleep %>% mutate_all(~paste(., "  /n  "))

" /n "全部替换为空

msleep_ohno <- msleep %>% mutate_all(~paste(., "  /n  ")) 

msleep_ohno %>%
  mutate_all(~str_replace_all(., "/n", "")) %>%
  mutate_all(str_trim)

mutate_if()对数据进行判断

如果数据类型是数值,对其进行四舍五入操作

msleep %>%
  select(name, sleep_total:bodywt) %>%
  mutate_if(is.numeric, round)
   name                       sleep_total sleep_rem sleep_cycle awake brainwt bodywt
   <chr>                            <dbl>     <dbl>       <dbl> <dbl>   <dbl>  <dbl>
 1 Cheetah                             12        NA          NA    12      NA     50
 2 Owl monkey                          17         2          NA     7       0      0
 3 Mountain beaver                     14         2          NA    10      NA      1

mutate_at( )对特定列进行操作

对列名含有sleep的进行操作

msleep %>%
  select(name, sleep_total:awake) %>%
  mutate_at(vars(contains("sleep")), ~(.*60))
   name                       sleep_total sleep_rem sleep_cycle awake
   <chr>                            <dbl>     <dbl>       <dbl> <dbl>
 1 Cheetah                            726        NA       NA     11.9
 2 Owl monkey                        1020       108       NA      7  
 3 Mountain beaver                    864       144       NA      9.6

更改列名

msleep %>%
  select(name, sleep_total:awake) %>%
  mutate_at(vars(contains("sleep")), ~(.*60)) %>%
  rename_at(vars(contains("sleep")), ~paste0(.,"_min"))
   name                       sleep_total_min sleep_rem_min sleep_cycle_min awake
   <chr>                                <dbl>         <dbl>           <dbl> <dbl>
 1 Cheetah                                726            NA           NA     11.9
 2 Owl monkey                            1020           108           NA      7  
 3 Mountain beaver                        864           144           NA      9.6

保留原始数据

msleep %>%
  select(name, sleep_total:awake) %>%
  mutate_at(vars(contains("sleep")), funs(min = .*60))
   name           sleep_total sleep_rem sleep_cycle awake sleep_total_min sleep_rem_min sleep_cycle_min
   <chr>                <dbl>     <dbl>       <dbl> <dbl>           <dbl>         <dbl>           <dbl>
 1 Cheetah               12.1      NA        NA      11.9             726            NA           NA   
 2 Owl monkey            17         1.8      NA       7              1020           108           NA   

ifelse创建2个级别的离散列

msleep %>%
  select(name, sleep_total) %>%
  mutate(sleep_time = ifelse(sleep_total > 10, "long", "short"))
   name                       sleep_total sleep_time
   <chr>                            <dbl> <chr>     
 1 Cheetah                           12.1 long      
 2 Owl monkey                        17   long      
 3 Mountain beaver                   14.4 long      

case_when创建多级离散列

此函数在后续数据清洗中有大有,需要多多练习

msleep %>%
  select(name, sleep_total) %>%
  mutate(sleep_total_discr = case_when(
    sleep_total > 13 ~ "very long",
    sleep_total > 10 ~ "long",
    sleep_total > 7 ~ "limited",
    TRUE ~ "short"))
   name                       sleep_total sleep_total_discr
   <chr>                            <dbl> <chr>            
 1 Cheetah                           12.1 long             
 2 Owl monkey                        17   very long        
 3 Mountain beaver                   14.4 very long        
 4 Greater short-tailed shrew        14.9 very long        

将数据转化为NA

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

推荐阅读更多精彩内容