【數據整理】R用tidyr包進行數據操作

2021-03-02 R語言

大家好!在這篇文章中,我會向你們展示如何用tidyr包進行數據操作。Tidyr包是由Hadely Wickham先生創建的,這個包提高了整理原始數據的效率,而且通常在連接詞之間使用。我們常說當把每個列都看作是一個變量,而每行都當作是它的函數的時候,這時我們就說這些數據需要進行整理。

下面我會列舉tidyr包的4個常用的函數及其用途:

gather-把寬度較大的數據轉換成一個更長的形式,它類比於從reshape2包中融合函數的功能。

spread-把長的數據轉換成一個更寬的形式,它類比於從reshape2包中鑄造函數的功能。

unite-把2個或多個列組合成一個單列。

separate-把一個列分解成兩個或多個列。

我會從數據集庫中調用mtcars數據集。如果你對這個數據集感到陌生,那我現在先給你看一下它是怎樣的:

library(tidyr)

library(dplyr)

head(mtcars)

                   mpg cyl disp  hp drat   wt  qsec vs am gear carb

MazdaRX4         21.0   6  160110 3.90 2.620 16.46  0  1    4    4

MazdaRX4 Wag     21.0   6  160110 3.90 2.875 17.02  0  1   4    4

Datsun710        22.8   4 108  93 3.85 2.320 18.61  1 1    4    1

Hornet4 Drive    21.4   6  258110 3.08 3.215 19.44  1  0   3    1

HornetSportabout 18.7   8  360 175 3.15 3.440 17.02  0 0    3    2

Valiant           18.1   6  225105 2.76 3.460 20.22  1  0   3    1

 

現在我們從mtcars數據集中查看一下car變量裡出現的名字,這樣我們更容易進行數據操作:

mtcars$car <- rownames(mtcars)

mtcars <- mtcars[, c(12, 1:11)]

 

gather

gather的形式如下(參照幫助文檔):

gather takesthe form (from the help file):

gather(data, key, value, ..., na.rm = FALSE, convert = FALSE)

這裡,……展示了所有要聚集的列的大致規格。

我們可以複製一下先前的腳本,看看它融合了什麼東西。

mtcarsNew <- mtcars="">% gather(attribute, value, -car)

head(mtcarsNew)

                car attribute value

1         Mazda RX4       mpg  21.0

2     Mazda RX4 Wag       mpg  21.0

3        Datsun 710       mpg  22.8

4    Hornet 4 Drive       mpg  21.4

5 Hornet Sportabout       mpg  18.7

6           Valiant       mpg  18.1

 

tail(mtcarsNew)

               car attribute value

347  Porsche 914-2      carb     2

348   Lotus Europa      carb     2

349 Ford Pantera L      carb     4

350   Ferrari Dino      carb     6

351  Maserati Bora      carb     8

352     Volvo 142E      carb     2

 

正如你看到的那樣,它把出了car以外的所有列都聚集起來,然後各自地把它們名字都放在各自的屬性和相應的值的列中。

tidyr包中有一樣最好的就是你可以只把已經確認好的列結合在一起而其它的列可以原封不動。如果我們想把從mpg到gear的所有列結合起來並除去carb和car的話,我們可以按一下的做法來做:

mtcarsNew <- mtcars="">% gather(attribute, value, mpg:gear)

head(mtcarsNew)

                car carb attribute value

1         Mazda RX4    4       mpg  21.0

2     Mazda RX4 Wag    4       mpg  21.0

3        Datsun 710    1       mpg  22.8

4    Hornet 4 Drive    1       mpg  21.4

5 Hornet Sportabout    2       mpg  18.7

6           Valiant    1       mpg  18.1

 

spread

spread的形式如下(來自於幫助文檔):

spread takesthe form(from the help file):

spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)

我們可以看一下它鑄造了什麼:

mtcarsSpread <- mtcarsnew="">% spread(attribute, value)

head(mtcarsSpread)

                 car carb  mpg cyl disp  hp drat    wt  qsec vs am gear

1        AMC Javelin    2 15.2   8  304 150 3.15 3.435 17.30  0  0    3

2 Cadillac Fleetwood    4 10.4   8  472 205 2.93 5.250 17.98  0  0    3

3         Camaro Z28    4 13.3   8  350 245 3.73 3.840 15.41  0  0    3

4  Chrysler Imperial    4 14.7   8  440 230 3.23 5.345 17.42  0  0    3

5         Datsun 710    1 22.8   4  108  93 3.85 2.320 18.61  1  1    4

6   Dodge Challenger    2 15.5   8  318 150 2.76 3.520 16.87  0  0    3

 

Unite

Unite的形式如下(來自於幫助文檔):

unite(data, col, ..., sep = "_", remove = TRUE)

這裡,….展示了要結合的列,而col則展示了要添加的列。

現在我們創建一下假數據:

set.seed(1)

date <- as.Date('2016-01-01') + 0:14

hour <- sample(1:24, 15)

min <- sample(1:60, 15)

second <- sample(1:60, 15)

event <- sample(letters, 15)

data <- data.frame(date, hour, min, second, event)

data

         date hour min second event

1  2016-01-01    7  30     29     u

2  2016-01-02    9  43     36     a

3  2016-01-03   13  58     60     l

4  2016-01-04   20  22     11     q

5  2016-01-05    5  44     47     p

6  2016-01-06   18  52     37     k

7  2016-01-07   19  12     43     r

8  2016-01-08   12  35      6     i

9  2016-01-09   11   7     38     e

10 2016-01-10    1  14     21     b

11 2016-01-11    3  20     42     w

12 2016-01-12   14   1     32     t

13 2016-01-13   23  19     52     h

14 2016-01-14   21  41     26     s

15 2016-01-15    8  16     25     o

 

現在,我們把data, hour, min和second這幾個列整合成一個叫datatime(時間日期)的列。通常情況下,R裡的時間的形式一般都是Year-Month-Day Hour:Min:Second(年-月-日 小時:分鐘:秒):

dataNew <- data="">%

  unite(datehour, date, hour, sep = ' ') %>%

  unite(datetime, datehour, min, second, sep = ':')

dataNew

              datetime event

1   2016-01-01 7:30:29     u

2   2016-01-02 9:43:36     a

3  2016-01-03 13:58:60     l

4  2016-01-04 20:22:11     q

5   2016-01-05 5:44:47     p

6  2016-01-06 18:52:37     k

7  2016-01-07 19:12:43     r

8   2016-01-08 12:35:6     i

9   2016-01-09 11:7:38     e

10  2016-01-10 1:14:21     b

11  2016-01-11 3:20:42     w

12  2016-01-12 14:1:32     t

13 2016-01-13 23:19:52     h

14 2016-01-14 21:41:26     s

15  2016-01-15 8:16:25     o

 

separate

separate的形式如下(來自幫助文檔):

separate takesthe form (from the help file):

separate(data, col, into, sep = "[^[:alnum:]]+", remove = TRUE,

  convert = FALSE, extra = "warn", fill = "warn", ...)

 

我們可以根據之前在進行separate操作時所創建的原始數據進行操作,詳細如下:

data1 <- datanew="">%

  separate(datetime, c('date', 'time'), sep = ' ') %>%

  separate(time, c('hour', 'min', 'second'), sep = ':')

data1

         date hour min second event

1  2016-01-01   07  30     29     u

2  2016-01-02   09  43     36     a

3  2016-01-03   13  59     00     l

4  2016-01-04   20  22     11     q

5  2016-01-05   05  44     47     p

6  2016-01-06   18  52     37     k

7  2016-01-07   19  12     43     r

8  2016-01-08   12  35     06     i

9  2016-01-09   11  07     38     e

10 2016-01-10   01  14     21     b

11 2016-01-11   03  20     42     w

12 2016-01-12   14  01     32     t

13 2016-01-13   23  19     52     h

14 2016-01-14   21  41     26     s

15 2016-01-15   08  16     25     o

 

它首先把datetime這個列分解成date和time,然後又把time分解成hour, min和second。

那麼,我已經到了文章的結尾。如果你還有什麼問題要反饋,你可以隨時進行留言或者來twitter找我。

 

原文連結:http://www.r-bloggers.com/data-manipulation-with-tidyr/

作者:何品言,熱愛英語何數據科學。

嚴禁修改,可以轉載,但是請註明出處(數據人網)和連結http://shujuren.org/index.php/Article/update/aid/135。

更多精彩內容,請點擊閱讀原文。

數據人網(http://shujuren.org),數據人學習、交流和分享的家園,專注於從數據中學習,努力發覺數據之洞見,積極利用數據之價值。為「讓人懂數據、用數據」之使命堅持做點事情。大家可以來投稿,做分享和傳播,可以給反饋。您有什麼想法,請反饋給我們,謝謝。數據人網,我們共建和共享。

相關焦點

  • R語言 | 數據操作tidyr包
    [更新~]Python網絡爬蟲與文本數據分析tidyr包
  • 30 天學會R DAY 15:tidyr包,數據整理另外一個利器
    第15天  tidyr包,R語言數據整理又一利器tidyr包 用來處理寬數據和長數據,用來進行字符串變量的拆分和合併
  • dplyr和tidyr簡介|數據處理
    數據處理兩大利器:dplyr和tidyr1 dplyr 簡介dplyr是Hadley Wickham
  • R語言 | 數據操作dplyr包
    [更新~] Python網絡爬蟲與文本數據分析公眾號只帶著Python字眼,卻分享著R語言,不務正業,任性了~dplyr簡介dplyr是R語言的數據分析包,很像python中的pandas,能對dataframe
  • 【R學習筆記】- 數據整形 - dplyr and tidyr
    dplyr包裡的group_by()和summarise(),這兩個函數我用過,tidyr包沒接觸過,但接觸過類似裡面的gather()、spread
  • 獨家 | 用於數據清理的頂級R包(附資源)
    因為沒有它,您將很難看到重要的內容,並可能由於數據重複,數據異常或缺少信息等原因做出錯誤的決策。 R,作為一種能夠應用於統計計算和圖形的開源語言,是最常用和最強大的數據編程工具之一。R提供了創建數據科學項目所需的所有工具,但是不管利用任何一種工具,它只能做到提供它接受到的數據相等同的信息。但是擁有了這些工具,R環境中有許多庫可以在任何項目開始之前進行數據處理和操作。
  • 寫給零基礎同學的R語言教程第三篇-神奇R包tidyr
    寫在前面:前兩篇:寫給零基礎同學的R和Rstudio教程寫給零基礎同學的R語言第二篇教程-數據類型獲取示例數據:公眾號[生信星球]留言回復"tidyr示例數據在對包有了一定的了解後,小抄是一個很好的學習操作指南,但是對於新手來說,很有可能完全看不懂。今天的教程有一部分參照了小抄,並作出了通俗的解釋。相信跟著教程走下去,就可以學個七七八八,跟著練練,然後自己研究一下小抄,一個R包就學個差不多啦。
  • [R數據科學]tidyverse數據清洗案例詳解
    本文將為您提供整理數據的實用介紹以及tidyr包中附帶的工具。如果你想了解更多的基本理論,你可能會喜歡發表在《統計軟體雜誌》上的tidy data論文[1]。本文框架數據清洗案例我們主要通過一個案例,來了解如何整潔數據,並將案例中的各個有用函數進行詳細解讀。
  • R語言數據處理方法~小結
    R自帶函數2. reshape2數據重構3. dplyr4. tidyr5. 字符串處理1. R自帶函數1.1 轉置使用函數t()可對一個矩陣或數據框進行轉置,對於數據框,行名將變成變量(列)名。2. reshape2包首先將數據「融合」(melt),以使每一行都是一個唯一的標識符-變量組合。然後將數據「重鑄」(cast),可以使用任何函數對數據進行整合成想要的任何形狀。
  • Tidyverse|tidyr數據重塑之gather,spread(長數據寬數據轉化)
    長型數據和寬型數據在數據分析中非常常見 ,其中寬型數據更具可讀性,長型數據則更適合做分析
  • 全棧數據之R語言常用包和函數
    用R做金融更多地需要掌握的是金融知識,只會數據分析技術意義寥寥。我覺得這些書對於懂金融、不同數據分析技術的人比較有用,只懂數據分析技術而不動金融知識的人看起來肯定如霧裡看花,甚至有人會覺得金融分析比較低級。
  • 教程 零基礎學用R進行數據挖掘
    圖形輸出窗口:這個空間顯示圖表中創建的探索性數據分析。不僅僅輸出圖形,您可以選擇包,尋求幫助和嵌入式R的官方文檔。3、如何安裝包?R的計算能力在於它擁有強大的R包。在R中,大多數數據處理任務可以從兩方面進行,使用R包和基本功能。在本教程中,我們將介紹最方便的和強大的R包。
  • R數據科學--初見
    終於你跨越茫茫宇宙,來到生信星球,發現了初學者的新大陸前些天豆豆花花各入手一本學R必備的神書《R數據科學》,花花完結了零基礎入門R語言系列和ggplot系列。現在開始跟著這本書的思路走,仔細端詳R語言。如果你還不了解這本書,👇看這裡。
  • R語言的數據管理
    利用R語言進行數據分析時,大部分的時間都是集中在清理數據,管理數據,然後通過數據可視化,發現可能存在內在關聯,然後進行統計學檢驗或者建立數學模型等等。包reshpe2包是一套重構和整合數據集的絕妙的萬能工具,而tidyr是他的繼承者。
  • 果子的R語言數據挖掘課程設計及複習
    初學者應該把有限的精力用在數據清理上。R語言的特點就是R包多,我們只要把數據調整到R包需要的格式,就可以輕易做出漂亮的圖片。目前這個領域原意授課並且授課比較好的老師,少之又少,不是因為技術的原因,僅僅是授課技巧。其實,這很能理解,一個事實就是,不是所有人都可以把事情講清楚。而我只是憑著一腔熱血和小時候未實現的教師夢,摸著石頭過河。
  • 工具手把手教你用R進行數據挖掘
    其中一些R包, 例如MASS,SparkR, ggplot2,使數據操作,可視化和計算功能越來越強大。我們所說的機器學習和R有什麼關係呢?我對R的第一印象是,它只是一個統計計算的一個軟體。但是後來我發現R有足夠的能力以一個快速和簡單的方式來 實現機器學習算法。這是用R來學習數據科學和機器學習的完整教程,讀完本文,你將有使用機器學習的方法來構建預測模型的基本能力。
  • R語言 | Tidyverse包入門介紹
    事到如今,依舊有「數據處理,Python和R到底學哪個」的爭辯。今天,我們講一個「讓R能夠和Python在數據處理方面一較高下」的擴展包:tidyverse包。然而,這些函數在進行大量數據處理的時候,不僅處理繁瑣,而且語句會顯得冗長,可讀性較差,降低了數據處理的效率。以此為契機,統計學家Hadley Wickham開發出了一系列數據處理的包,整合成為一個,這就是tidyverse包,它裡面包括了與數據處理相關的內容,如ggplot2,dplyr,tidyr,tibble等等。
  • 精心整理(含圖版)|你要的全拿走!(R數據分析,可視化,生信實戰)
    為了能更方便的查看,檢索,對文章進行了精心的整理。建議收藏,各取所需,當前沒用也許以後就用到了呢! :測序結果的數據質控及圖標展示;Bioinfo|bedtools-操作VCF文件 VCF文件的常見合併,過濾等操作;R|生存分析(1) :生存分析介紹以及R實現
  • 教你用R進行數據挖掘(2)
    三、用R進行數據預處理從這一節開始,我們將深入閱讀預測建模的不同階段
  • 玩轉數據處理120題|Pandas&R
    和我一起玩Python本文精心挑選在數據處理中常見的120種操作並整理成習題發布。