官术网_书友最值得收藏!

2.5 數據操作入門

在實際工作中,往往需要對數據(在R中數據通常以數據框形式保存,即data.frame)進行復雜的清洗轉化操作,包括創建、添加、刪除、插入、排序、過濾、分組、匯總、連接、長寬轉換等。這些操作使用頻次很高,因此初學者需要在剛入門的時候就掌握這些操作。本節將主要使用tidyfst包來對數據進行操作,這個包語法結構與dplyr類似,而底層則利用data.table來構筑,運行速度快、語法簡潔優雅,非常適合初學者使用。同時,本部分還會根據要解決的問題,進行講解和探討,并在必要的時候介紹更多的工具包來滿足多元化的需求。

2.5.1 文件讀寫

在數據分析中,第一步就是要把數據導入到軟件環境中,通常把這個步驟叫作文件讀寫(File Input/Output)。在文件讀寫的過程中,通常會考慮的因素包括:

● 讀入和寫出是否正確,即讀寫不能改變原有數據。

● 讀寫速度是否足夠快,高性能讀寫工具能夠減少讀寫的時間。

● 寫出的數據是否足夠小,也就是說保存的文件大小應該限制在一定范圍內。

● 導出數據格式通用性是否夠用,是否能夠在其他系統或軟件環境中打開。

R語言的文件讀寫系統非常完備,而且在拓展包的支持下幾乎能夠讀寫任意格式的數據。本節將會對主流的數據讀寫方法進行介紹,并對其性能特點進行解析。

1.csv文件的讀寫

csv(Comma-Separated Values)的中文名稱為逗號分隔值,是一種常見的文件格式,它能夠保存R中的數據框。這種文件格式,能夠在Excel、Python等其他軟件工具中導入導出,是非常流行的通用數據保存格式。在R語言中,可以直接利用基本包內置的read.csvwrite.csv函數來讀寫csv文件,但是它們的功能不夠強大,因此這里直接給出相對安全而更快捷的方法:

● 如果文件比較大,使用data.table包的fread函數來讀取csv文件。

● 如果文件比較大,使用data.table包的fwrite函數來寫出csv文件。

● 如果讀取文件出現亂碼問題,嘗試給fread函數加設參數encoding="UTF-8"。

● 如果寫出函數用Excel打開出現亂碼問題,嘗試使用readr包的write_excel_csv函數來寫出。

接下來做一個演示,把內置的iris數據集讀出到D盤根目錄中。請確保D盤根目錄下沒有同名文件(文件名稱為“iris.csv”)。首先把R的內置數據框iris寫出。

D盤根目錄下就有了一個名為“iris.csv”的文件,讀者可以自行打開查看。然后,使用fread函數把它讀回來。

需要注意的是,fread函數返回的是data.table類型的數據,它的本質依然是一個數據框。如果需要處理編碼格式問題,可以加設參數:

如果需要在寫出的時候讓Excel能夠自動識別編碼格式,可以使用readr包的write_excel_csv函數。

最后,我們直接在R中把這個寫出的文件刪除掉。

2.二進制文件的讀寫

如果想要獲得更好的讀寫性能,就需要把數據文件存為二進制格式。在R中,使用readRDS函數wirteRDS函數可以對任意R對象進行二進制文件的讀寫,如果要保存和讀取多個變量,則可以使用load/save組合。使用二進制文件進行存取,會比其他方法更快,而且保存的文件占用內存也會更加少。在這個基礎上,R的擴展包還能夠讓二進制文件讀寫的速度再提高一個水平,這里,對其中fst、feather、qs、ao 3個包進行簡單介紹和比較。這3個包的各自特點如下。

● fst:保存速度快,而且對文件具有壓縮作用,但是只能對數據框進行保存;

● feather:與fst類似,而且輸出的文件格式能夠被Python進行讀寫,能夠很好地與Python數據科學工作流進行對接;

● qs:與fst類似,但是可以對任意R對象(不僅限于數據框)進行序列化壓縮存取。

下面,嘗試比較上述3個包的讀寫速度和保存文件大小,以評估三者的讀寫效果。如果讀者目前還無法了解這些代碼的細節,可以跳過過程直接看結論,來指導自己在不同的情況下使用不同的工具。

首先,加載 3個包和其他必要的包。需要說明的是,目前,feather項目已經轉移到Apache Arrow中,因此需要在arrow包中對其調用,才能夠獲得最新也是最佳的性能(https://github.com/wesm/feather)。同時,會調用tidyfst包的import_fst函數export_fst函數,它們的本質就是fst包的read_fst函數write_fst函數,但是會把壓縮因子調到最大,也就是盡可能地讓輸出文件變小。

另外,需要構造一個足夠大的數據框來測試性能。把iris數據集的第一行復制一千萬次,形成一個一千萬行的數據框,并保存在a變量中。

因為不同平臺具有不同的情況,在此不顯示運行結果。在這個例子中,我們獲取的數據框大小為1GB,接下來,演示如何構造一個臨時的路徑來保存它。

觀察tf,可以發現它是一個臨時文件路徑。接下來構建一個測試函數test,把上面構造臨時文件路徑的方法融入其中。

以下對上面的代碼稍作解析。其中system.time函數可以求得運行時間,取出其中的“user.self”屬性是用戶實際的等待時間(單位為秒);而fileSize函數來自于MODIS包,可以根據文件路徑求得文件的實際大小,并設置其大小單位(這里設置為KB)。這個函數會測試read_funwrite_fun這兩個函數的運行時間和輸出文件大小,最后輸出。通過更換讀寫函數,能夠測試不同包的讀寫效果。我們為函數設置一個class參數,用來進行標注。下面進行測試:

在測試中,最后獲得結果如下所示:

可見,文件壓縮效果最好的是tidyfst包,在R環境中占用內存1GB的數據,導出后只有約692KB。從讀寫時間上來看,fst包的效果最好,讀取文件只用了約0.19秒,寫出文件只用了0.06秒。因此就數據框的讀寫而言,當前fst包是最佳的選擇。在默認條件下,fst包的write_fst函數會把壓縮因子(compress參數)設置為 50,這是對讀寫速度和文件大小的一個權衡。但是如果文件比較大,那么文件本身的傳輸速度就會減慢(例如我們寫出的文件,要存到U盤或者上傳到網絡)。因此,在tidyfst中直接把compress參數設置為100,以確保輸出文件盡可能小。在實際應用中,用戶需要根據自己的需求進行設置使用。綜合上述試驗,可以得到如下的結論:

● 基本包的函數最慢,因此條件允許的情況下應該避免使用。

● 保存數據框的時候盡量使用fst包,它速度快,而且壓縮效果最好。

● 如果需要讓文件盡可能小,使用tidyfst包的export_fst函數,或把fst包中的write_fst函數的compress參數設為100。

● 如果需要保存數據框以外的R對象,使用qs包的qreadqsave函數。

● 如果需要與Python工作流對接,使用arrow包的read_featherwrite_feather函數。

3.其他文件格式的讀寫

通過各式各樣的拓展包,R可以對各種格式的文件進行讀寫,這些文件包括表格、文本、圖像、音頻、視頻等。這些擴展包中的一些工具不僅僅具備讀寫各種文件的功能,還能夠對讀入的數據進行預處理和進一步的分析。接下來,將介紹不同格式文件可以用什么包讀寫,應該用其中的什么函數讀寫。

(1)表格數據讀寫

● readr:能夠讀寫二維表形式的數據,主要支持csv格式的文件讀寫。經典的讀寫函數組合為read_csv/write_csv,而根據讀寫細節的變化,又衍生出read_tsv、read_csv2、write_excel_csv等函數,相關內容可參考官方網址https://github.com/tidyverse/readr。

● rio:可以根據文件擴展名對文件形式進行識別,然后進行讀寫。主要函數為import/export,支持包括csv、json、xlsx、fst、feather、mat(Matlab文件格式)在內的多種文件格式的讀寫。在導入多表格文件(如xlsx中的多個工作簿)時,可以使用import_list/export_list函數。更多細節信息參考https://github.com/leeper/rio。

(2)文本數據讀寫

● readtext:可以讀取包括pdf、docx、xml、json在內的各種文本文件,核心函數為readtext。讀取后獲得的R對象為數據框,一列為文件名,一列為文本內容。獲得的數據格式能夠很好地利用quanteda包進行后續操作,詳細信息見https://github.com/quanteda/readtext。

● textreadr:可以讀取包括rtf、html、docx在內的多種文本數據類型,還可以讀取路徑下的所有文本文件,并展示其文本存儲結構。更多內容請參考https://github.com/trinker/textreadr。

(3)圖像數據讀寫

● magick:R中的高級圖像處理軟件包,可以通過image_read/image_write來對圖像文件進行讀寫,具體信息可參考https://github.com/ropensci/magick。

● imager:基于CImg的R圖像處理庫,可以快速處理多達4個維度的圖像信息(兩個空間維度、一個時間或深度維度,一個顏色維度)。在該體系中,可以使用load.image/save.image來進行圖像文件的讀寫,更多信息可參考https://github.com/dahtah/imager。

(4)音頻/視頻數據讀寫

● av:可以在R中對音頻和視頻進行分析的工具,其中read_audio_bin和read_audio_fft兩個函數可以對音頻數據進行讀取,詳細信息見https://github.com/ropensci/av。

● seewave:能夠實現分析、操作、顯示、編輯和合成時間波的功能(特別是音頻文件),可以用export和savewav函數進行文件導出。關于音頻文件的輸入輸出,可以參考https://cran.r-project.org/web/packages/seewave/vignettes/seewave_IO.pdf獲得進一步的了解。

上面介紹的一些工具包,是R中文件讀寫拓展包的一部分,事實上R中還有很多功能強大的包能夠進行文件信息的提取和寫出。例如docxtractr包能夠自動提取Word文件中的表格信息(https://github.com/hrbrmstr/docxtractr),openxlsx包能夠批量讀取Excel文件的多工作簿,進行各種編輯后再批量導出。因此,如果有更多特定需求的時候,可以在網絡中進行深度的查詢來找到合適的包,從而對特定格式的文件進行讀寫和編輯。

4.并行讀取多個文件

在日常的工作任務中,經常可能遇到需要讀取多個數據文件,然后將其合并成一個統一文件的情況。如果文件數量比較多,這個步驟往往會非常耗時,利用并行計算,就能夠有效地解決這個問題。在介紹并行操作之前,先對并行計算的概念進行簡單的介紹。能夠并行化的任務,要符合“Split-Apply-Combine”準則,也就是任務是可分割的,然后再局部分別運行,最后把結果合并在一起。舉個例子,任務A是做雞蛋料理,分為打雞蛋和煮雞蛋兩個部分;任務B是折一百只千紙鶴。那么,任務A是串行的,如果不先打雞蛋,就沒有雞蛋可以煮;任務B是并行的,因為可以讓5個人每人折20只千紙鶴。要進行并行運算,還對計算機的硬件有一定要求,必須能夠支持多線程的計算。目前市面一般的計算機都能夠支持,如果核心數量越多,那么并行的效果就越好。設置并行運算具有一定的時間成本,但是如果數據量特別大,這些時間成本基本可以忽略不計。

接下來會講解如何在R中進行多個文件的并行讀取,將會使用future.apply包來進行實現。future.apply包能夠對R基本包中的apply族函數進行并行化的部署,而且語法結構與基本包維持一致,非常便捷。

在演示如何進行并行讀取之前,先來構造一個文件夾,里面有500個一模一樣的csv文件。

首先,在D盤根目錄下創建一個名為“test_parallel”的文件夾,讀者實際操作時要需要注意D盤中不能有同名的文件夾。

然后,會用iris作為操作數據在該文件夾中寫出。一共寫出500個csv文件,文件名稱為1到500的正整數。寫出的時候需要給出文件的絕對路徑,因此利用paste0函數來構造文件名稱,它能夠對字符串進行拼接。

如下所示,在D盤的test_parallel文件夾中就寫出了500個csv文件。接下來對其進行并行讀取,然后合并成一個數據框。

至此,df中就保存了這500個文件讀入后合并的結果。

以上操作的實質是,先利用dir函數獲取所有目標文件的路徑(注意:需要把full.names參數設置為TRUE,這樣才能夠獲得絕對路徑的名稱);然后使用plan(multiprocess)這段代碼一鍵設置并行環境;最后,利用future_lapply函數對路徑下所有的文件(所有文件路徑保存在fn中)進行并行讀?。ㄊ褂胒read作為讀取函數)。這一步會得到一個列表,列表中包含多個數據框,然后我們使用rbindlist函數將列表中所有的數據框按行合并到一起。

需要注意的是,不是所有的情況都適合使用并行讀取,并行讀取方式本身也具有一定的風險。例如在并行讀取多個文件的過程中,如果其中一個文件的讀取出了錯誤,或者格式不一致,就會導致最后合并的時候出錯或無法得到正確結果。但是如果使用串行方式讀取,那么就可以把前面正確合并的結果保存下來,并且能夠知道出錯的文件是哪一個。

實現串行合并也非常簡單,操作如下。

all就是合并后獲得的數據框。如果中間出錯,則可以檢查i合并到哪里,而之前合并的結果也會保存在all中,可以對當前出錯的文件進行排錯或跳過,然后繼續進行讀取合并。最后,把創建的文件夾刪掉。

2.5.2 數據框的檢視

對于一個讀入的數據框,往往希望盡可能地了解它的結構,包括:這個數據表有幾行幾列,每一列的數據類型是什么,每一列中是否有缺失值,缺失值的比例是多少,連續型隨機變量的分布大概是什么樣子的,離散型隨機變量不同的變量出現頻次是多少,在R的基本包中,有一系列的函數來進行這些基礎的數據探索。以R自帶的iris數據集為例,如果需要知道它由幾行幾列構成,則可以用dim函數實現。

如果想要深挖其數據類型,可以使用str函數。

可以發現,iris數據框的前4列為數值型變量,而最后1列為因子型變量。

此外,我們還可以用headtail函數來觀察數據框的前6行和后6行。

如果想要了解每一列的數據分布,可以使用summary函數。對于數值型變量而言,可以顯示其四分位數、極值和均值;對于因子變量而言,則會對其分類進行計數。

如果需要快速地從整體層面了解一個數據框,這里推薦使用skimr包的skim函數,能夠用最少的代碼來獲知數據框的方方面面,如下所示。

通過使用skim函數,可以迅速獲知數據框的行列數量,并能夠了解不同類型的屬性分別有多少列,對于不同的變量還會進行更加深入的探索展示。關于skimr包的更多用法,可以參考https://docs.ropensci.org/skimr/articles/skimr.html。

2.5.3 單表操作

所謂單表操作,就是基于單個表格進行的數據操作,包括檢索、篩選、排序、匯總等。下面,將會以tidyfst包作為主要工具來說明如何在R中完成這些單表操作。

1.檢索

檢索就針對用戶的需求來提取總數據集一部分進行查閱,一般可以分為行檢索與列檢索。在行檢索中,一般是根據數據條目所在位置進行檢索。例如想要查看iris數據表的第 3行,可以使用slice_dt函數進行行檢索,具體操作如下。

如果想要查看多列,可以使用向量作為檢索內容。

對列進行檢索則具有更多靈活的選擇。首先,與行檢索類似,可以根據列所在的位置,通過select函數來對列進行檢索。

其次,還可以通過變量的名稱,使用select函數直接對其中的一個或多個變量進行檢索。

如果要按照名稱選擇多列,還可以使用正則表達式的方法。例如要選擇列名稱中包含“Pe”的列,可以進行如下操作。

與此同時,還可以根據數據類型來選擇列,例如如果需要選擇所有的因子變量,可以進行如下操作。

如果要進行反向選擇,在要去除的內容(可以是變量名、所在列數或正則表達式)前面加負號(“-”)即可。

2.篩選

篩選操作就是要把數據框中符合條件的行篩選出來,在tidyfst包中可以使用filter_dt函數實現。例如要篩選iris數據框中Sepal.Length列大于7的條目,可以操作如下。

在篩選條件中,可以使用與(&)、或(|)和非(!)3種邏輯運算符,來表達復雜的條件關系。例如,想要篩選Sepal.Length大于7且Sepal.Width大于3的條目,可以操作如下。

3.排序

在數據框的操作中,可以根據一個或多個變量對行進行排序。在tidyfst包中,可以利用arrange_dt函數對排序進行實現。例如,如果想要根據Sepal.Length進行排序,可以操作如下。

從結果中可以獲知,默認的排序是升序排列。如果需要降序排列,那么要在變量前面加上負號。

同時,可以加入多個變量,從而在第一個變量相同的情況下,根據第二個變量進行排列。

可以看到,當Sepal.Length都等于4.4的時候,條目是根據Sepal.Width進行升序排列的。

4.更新

此處提到的更新是指對某一列進行數據的更新,或者通過計算獲得一個新的數據列。在tidyfst包中,可以使用mutate_dt函數對列進行更新。例如,想要讓iris數據框中的Sepal.Length列全部加1,具體操作如下。

也可以新增一列,例如要新增一個名稱為one的列,這一列的數據為常數1。

如果我們在更新之后,只想保留更新的那些列,可以使用transmute_dt函數

上面的例子中,我們就僅保留了更新后的兩列。如果需要分組更新,可以使用by參數定義分組信息。例如,我們想要把iris數據框中,根據物種進行分組,然后把Sepal.Length的平均值求出來,附在名為“sp_avg_sl”列中,操作方法如下。

5.匯總

匯總,即對一系列數據進行概括的數據操作。求和、求均值、最大值、最小值,均可以視為匯總操作。可以使用tidyfst包的summarise_dt函數實現各類匯總。例如,我們想求iris數據框中Sepal.Length的均值,可以進行如下操作。

在上面的操作中,把最終輸出的列名稱設定為“avg”。

在實際應用中,往往需要進行分組匯總操作,這可以通過設定summarise_dt函數的by參數進行實現。例如,想知道每個物種Sepal.Length的均值,可以這樣操作。

2.5.4 多表操作

在實際工作中,很多時候不僅是要對一個表格進行操作,而是要進行多個表格數據的整合歸并。在tidyfst的工作流中,有3種處理多表操作的模式,包括更新型連接、過濾型連接和集合運算操作,下面一一進行介紹。

1.更新型連接

更新型連接(Mutating joins)是根據兩個表格中的共有列進行匹配,然后完成合并的過程,可以分為內連接、外連接、左連接和右連接4種。下面,構造一個數據集來對4種連接進行說明。

在上面的代碼中,構造了兩個數據框(df1和df2)。其中,df1中有消費者的ID號和他們買了什么產品;df2中則包含了消費者ID號和他們所在的地點(省份)。

(1)內連接操作

內連接又稱為自然連接,是根據兩個表格某一列或多列共有部分進行連接的過程。以下對之前構造的兩個表格進行內連接,可以使用inner_join_dt函數完成。

通過上面的結果,我們可以看到,如果沒有設定連接的列,inner_join_dt函數會自動識別兩個數據框中的同名列進行匹配。在內連接中,會找到df1和df2同名列CustomerId中完全匹配的條目進行連接。如果希望直接設定合并的列,可以使用by參數來特殊指定。

(2)全連接操作

在進行內連接的時候,不匹配的條目會全部消失。如果想要保留這些條目,可以使用全連接函數full_join_dt,它會保留兩個表格中所有的條目,而沒有數值的地方,并自動填充缺失值,如下所示。

在上面的結果中,可以看到,在df2中沒有消費者1、3、5的地區數據,因此填充了缺失值NA。

(3)左連接和右連接

左連接和右連接是互為逆運算的兩個操作(左連接函數:left_join_dt,右連接函數:right_join_dt),左連接會保留左邊數據框的所有信息,但是對于右邊的數據框,則只有匹配的數據得以保留,不匹配的部分會填入缺失值。下面代碼是左連接和右連接的操作演示。

(4)指定連接表格的共有列

有的時候,需要將兩個或以上的列進行連接,可以通過設置by參數來完成。下面舉例說明。

在上面的代碼中,獲得了workers和position2兩個數據框。其中,workers數據框中的name為工人名稱,而position2數據框中的worker列為數據名稱,因此兩者合并的時候需要根據名稱不同的列進行匹配。

得到的結果會保留第一個出現的數據框的名稱,即workers數據框中的name,而第二個數據框position2的worker列則會消失。

2.過濾型連接

過濾型連接(Filtering joins)是根據兩個表格中是否有匹配內容來決定一個表格中的觀測是否得以保留的操作,在tidyfst包中可以使用anti_join_dt函數semi_join_dt函數實現。其中,anti_join_dt函數會保留第一個表格有而第二個表格中沒有匹配的內容,而semi_join_dt函數則會保留第一個表格有且第二個表格也有的內容。但是,第二個表格中非匹配列的其他數據不會并入生成表格中。

3.集合運算操作

在R中,每個向量都可以視為一個集合,基本包提供了intersect/union/setdiff函數來求集合的交集、并集和補集,并可以使用setequal函數來查看兩個向量是否全等。以下對集合運算做一個簡單的操作演示。

在tidyfst中,通過data.table包中的集合運算函數,包括union_dt、intersect_dt、setdiff_dtsetequal_dt,可以直接對數據框進行對應的集合運算操作。需要注意的是,所求數據框需要有相同的列名稱。下面利用iris的前3列來做一個簡單的演示。

這些函數都有all參數,可以調節其對重復值的處理。例如,如果取并集的時候不需要去重,那么可以設置“all=TRUE”。

2.5.5 缺失值處理

在數據處理的時候,難免會遇到數據集包含缺失值的情況。這有可能是因為人工失誤引起的,也可能是系統故障導致的。根據缺失值分布的特征,通??梢园讶笔闆r分為 3類:完全隨機缺失(Missing Completely At Random,MCAR)、隨機缺失(Missing At Random,MAR)、非隨機缺失(Missing Not At Random,MNAR)。常常需要根據數據缺失的分布特征,來推斷數據缺失的真實原因,從而考慮如何處理這些缺失值。一般而言,缺失值的處理有3種手段:刪除、替換、插值。下面,將會介紹如何利用tidyfst包在R中實現這3種缺失值處理。

1.缺失值刪除

刪除缺失值可能是缺失值處理中最為簡單粗暴的方法,在樣本量非常大的時候,直接刪除缺失值往往對結果影響不大,而實現的成本又較低。在tidyfst包中,有3個函數能夠對包含缺失值的數據進行直接刪除。

drop_na_dt:行刪除操作,如果一列或多列中包含任意缺失值,對整行進行刪除。

delete_na_cols:列刪除操作,如果數據框中任意列的缺失值比例或數量超過一個閾值,則將整個列刪除掉。

delete_na_rows:行刪除操作,如果數據框中任意行的缺失值比例或數量超過一個閾值,則將整個列刪除掉。

下面舉例演示缺失值刪除的操作。首先要構建一個缺失值數據框。

所構造的數據框中,第一、二、三、四列分別有1、2、0和3個缺失值。如果想要刪除col2中包含缺失值的條目,可以使用drop_na_dt函數。

如果想要刪除缺失值大于等于2個或缺失比例大于等于50%的列,則可以操作如下。

如果想要刪除缺失值大于等于2個或缺失比例大于等于50%的行,則可以操作如下。

2.缺失值替換

缺失值替換就是把缺失的部分用指定數據進行替代的過程,在tidyfst中可以使用replace_na_dt函數進行實現。例如,要將上面所構造數據框的col1列缺失值替換為-99,可以操作如下。

也可以同時對col1和col4同時進行這項操作,如下所示。

如果不設定替換列,則默認替換所有的列。但需要注意的是,每一個列的類型都不一樣,因此在替換的時候需要保證替換列數據類型的一致性。

3.缺失值插值

與替換不同,缺失值的插值需要根據列中數據的關系來對要插入的值進行一定的計算,然后再填入到缺失的部分。在tidyfst包中,可以完成插值的函數包括。

fill_na_dt:把缺失值替換為其最臨近的上一個或下一個觀測值。

impute_dt:根據列匯總數據(平均值、中位數、眾數或其他)來對缺失值進行插補。

以下是fill_na_dt的操作演示,它的原理非常簡單。

有的時候,會希望用均值來對數值型的變量進行插值,可以操作如下。

如果把.func設置為“mode”和“median”,就可以分別利用其眾數和中位數進行插值。在此不再專門說明,讀者可以自行操作。

2.5.6 長寬數據轉換

表格的長寬轉換是一個經典的數據操作,它可以自由地改變二維表的結構。例如對于iris數據框,可以將其轉化為任意的其他結構。下面我們給每一朵花都進行編號,然后直接轉為長表格式,如下所示。

在輸出的結果中,可以看到3列,分別為id、name和value。以第一行為例,它表示id為1的花朵的Sepal.Length屬性值為5.1。這種長寬變換能夠讓我們自如地對數據框結構進行重塑,從而獲得滿足分析要求的數據結構。

1.寬表轉長表

在tidyfst包中,可以使用longer_dt函數來把寬表轉化為長表,需要定義的核心參數是數據框和分組列。分組列就是不參與長寬變換的列,而其他列名稱將會統統聚合起來成為一列。下面我們進行一個簡單的演示。首先進行數據準備。如下所示,這是一個10行4列的數據框,一列為時間time,其余3列為數值列。

接下來,我們要使用longer_dt函數把它轉化為長表。

可以發現,列名稱X、Y、Z都在name列中,其值則在value列中。這些列名稱可以通過更改name和value參數重新被定義,如下所示。

2.長表轉寬表

實現長表轉為寬表的函數為wider_dt。長表轉為寬表是寬表轉長表的逆運算,因此需要定義的核心參數也有相仿之處,需要知道數據框、分組列的信息,同時需要知道名稱列(name)和數值列(value)分別來自哪里。以上面生成的longer_table為例,嘗試把它進行還原,具體操作如下。

在上面的代碼中,把time定義為分組列,然后以字符形式來定義哪一列是名稱列,哪一列是數值列。在寬表轉長表的時候,name和value如果不自定義,就會自動給名稱列命名為“name”,給數值列命名為“value”;但是在長表轉為寬表的時候,則必須手動進行定義,否則計算機無法自動識別。

主站蜘蛛池模板: 赞皇县| 旅游| 深水埗区| 永和县| 宾川县| 胶州市| 尖扎县| 巴林左旗| 隆安县| 阳曲县| 肥城市| 南投县| 枞阳县| 龙里县| 皮山县| 河间市| 雷波县| 洛隆县| 如东县| 福州市| 揭东县| 蒲城县| 南郑县| 阜平县| 峨边| 黔西县| 宜川县| 宝丰县| 那曲县| 阿拉善盟| 安图县| 平凉市| 惠东县| 肥西县| 黑河市| 广汉市| 鄂伦春自治旗| 金门县| 班玛县| 松原市| 八宿县|