R語言基礎(chǔ)入門(4) mutate函數(shù)創(chuàng)建新列

今天繼續(xù)介紹dplyr包中的重要函數(shù)mutate,其基本功能為創(chuàng)建新列;mutate中的選項(xiàng)幾乎是無窮無盡的,可以通過各種函數(shù)之間的組合來對數(shù)據(jù)集做任意的處理,下面通過具體的案例來進(jìn)行演示

這次我們使用R內(nèi)置的數(shù)據(jù)集msleep,其中包括哺乳動(dòng)物的睡眠時(shí)間。讓我們首先加載包并查看數(shù)據(jù):

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 基礎(chǔ)操作

最簡單的的操作就是根據(jù)其他列中的值進(jìn)行計(jì)算。在示例代碼中,我們將睡眠數(shù)據(jù)從以小時(shí)為單位更改為分鐘為單位

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

下列代碼創(chuàng)建了兩列新列:一列顯示了睡眠時(shí)間與平均睡眠時(shí)間的差異,另一列顯示了與睡眠時(shí)間最少的動(dòng)物之間的差異;round( )對數(shù)據(jù)進(jìn)行四舍五入操作

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( )說明按行進(jìn)行操作

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判斷語句對數(shù)據(jù)進(jìn)行操作,如果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

也可以結(jié)合使用stringr的功能或正則表達(dá)式來對字符串列進(jìn)行操作;
示例代碼將返回動(dòng)物名稱的最后一個(gè)單詞,并使其小寫

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        

對多列同時(shí)進(jìn)行操作

  • mutate_all() 將對所有列進(jìn)行操作
  • mutate_if()首先需要一個(gè)返回布爾值,如果是T,則將在這些變量上執(zhí)行mutate指令
  • mutate_at()要求在vars() 參數(shù)內(nèi)指定要進(jìn)行改變的列

將所有數(shù)據(jù)轉(zhuǎn)換為小寫:

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()對數(shù)據(jù)進(jìn)行判斷

如果數(shù)據(jù)類型是數(shù)值,對其進(jìn)行四舍五入操作

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( )對特定列進(jìn)行操作

對列名含有sleep的進(jìn)行操作

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

保留原始數(shù)據(jù)

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創(chuàng)建2個(gè)級別的離散列

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創(chuàng)建多級離散列

此函數(shù)在后續(xù)數(shù)據(jù)清洗中有大有,需要多多練習(xí)

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        

將數(shù)據(jù)轉(zhuǎn)化為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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,995評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內(nèi)容