R|數據處理|list的轉化與轉置

2021-03-02 表哥有話講

Dwzb , R語言中文社區專欄作者,廈門大學統計專業學生。

知乎專欄:https://zhuanlan.zhihu.com/Data-AnalysisR 

本文講述思路如下

list 轉化為 data.frame

分為以下兩種情況

(1)list 的每個元素作為一列

下面代碼的講述思路為

# 1.最簡單的listl <- list(1:4,2:5)as.data.frame(l) # 生成4*2的數據框data.frame(l) # 結果同上# 複雜一點# 一個更複雜的list,兩層list,代表不同組別,需要分別轉化為數據框,然後拼接在一起ll <- list(a = list(x = 1:10, y = 2:11, group = 1),           b = list(x = 11:20, y = 12:21, group = 2))# 一法dfll <- do.call(rbind,lapply(ll, data.frame))dfll# 二法,使用plyr包中的函數library (plyr)df <- ldply (ll, data.frame)df# 三法,使用data.table包中的函數library(data.table)ll0 <- list(a = list(x = 1:10, y = 2:11),           b = list(x = 11:20, y = 12:21))rbindlist(ll0) # 此函數無法處理ll,因為無法循環對應# 再複雜一點# 如果其中有一列是我們不想要的,需要先提取再轉化為data.framell1 <- list(a = list(x = 1:10, y = 2:11, z = 1:3),           b = list(x = 11:20, y = 12:21, z = 1:3))# 如果直接使用這條命令,會報錯# do.call(rbind,lapply(ll1, data.frame))# 因為10不是3的倍數,無法循環對應,所以我們要把z這列去掉f <- function(x){  data.frame(x[1:2])}do.call(rbind,lapply(ll1, f))

(2)list 的每個元素作為一行

這裡的一些方法其實是先轉化成這樣的矩陣,再將矩陣轉化為數據框的,所以下文list轉化為矩陣的這部分就不再贅述

# 變成向量之後再轉化為矩陣,再轉化為數據框df <- data.frame(matrix(unlist(l), nrow=2, byrow=T),stringsAsFactors=FALSE)df# 使用rbind.data.frame函數# a <- rbind.data.frame(l) 不可以這樣使用do.call(rbind.data.frame, l) # do.call 函數是將前面函數的參數放在一個list中使用,正好l是這樣一個list,它表示該函數的多個參數,而不是第一個參數是這個list# 用sapply將每一個元素變成向量,組成一個矩陣。下面兩種寫法等價data.frame(t(sapply(l,c)))data.frame(t(sapply(l, `[`)))# 使用Reduce函數實現累加效果data.frame(Reduce(rbind, l)) # 像累加一樣,每一個元素拿出來作為rbind的參數,和之前結合的結果再一次結合

data.frame 轉化為 list

我們要實現如下轉化

每一列作為list的一個元素

每一行作為list的一個元素

對行進行分組,每一組作為list的一個元素

df <- data.frame(x=1:4,y=2:5,z=rep(1:2,2))# 先看看list和as.list函數的結果是什麼樣的as.list(df) # 每一列對應list的一個元素list(df) # 一整個數據框成為list的一個元素split(df, 1:4) # 每一行作為list的一個元素split(df, df$z) # 按照z列進行分組

matrix 轉化為 list

我們想將matrix的每一行或者每一列作為list的一個元素,list 和 as.list 函數不能實現,前者是將整個矩陣作為list的一個元素,後者是將每一個值作為list的一個元素

我們使用如下方法實現這一過程

# matrix的每一列作為list的一個元素mat <- matrix(c(1:4,2:5), byrow=F,ncol=2)# 下面每一行都可以實現tapply(mat,rep(1:ncol(mat),each=nrow(mat)),function(i)i) # 分組計算生成一個listsplit(mat, rep(1:ncol(mat), each = nrow(mat)))split(mat, col(mat)) # 更簡潔的寫法as.list(as.data.frame(mat)) # 速度比較慢lapply(seq_len(ncol(mat)), function(i) mat[,i])plyr::alply(mat,2)# matrix的每一行作為list的一個元素# 一種方法是將mat轉置之後用上面的方法,還有下面兩種方法split(mat, row(mat)) lapply(seq_len(nrow(mat)), function(i) mat[i,])

list 的轉置

這部分對兩個類型的list進行轉置

ax <- data.frame(a=1,x=2)ay <- data.frame(a=3,y=4)bw <- data.frame(b=5,w=6)bz <- data.frame(b=7,z=8)before <- list(  a=list(x=ax, y=ay),   b=list(w=bw, z=bz))after  <- list(w.x=list(a=ax, b=bw), y.z=list(a=ay, b=bz))beforeafter# 實現將 before 轉換成after形式,其實就是對列表進行轉置# 另外一個例子,list 中的元素是向量而不是listl <- list(1:4,1:4)

下面使用幾種方法實現

# 第一種方法,使用 data.table 和 purrr 包中現成的函數# data.table::transpose(before) # 處理不了purrr::transpose(before)data.table::transpose(l) # list 的每個元素是向量purrr::transpose(l) # list的每個元素還是list# 第二種方法,自己編寫函數# 下面兩行結果和 purrr::transpose 相同lapply(1:2, function(i) lapply(before, "[[", i))lapply(1:4, function(i) lapply(l, "[[", i))lapply(1:4, function(i) sapply(l, "[[", i)) # 和 data.table::transpose 一樣lapply(1:2, function(i) sapply(before, "[[", i)) # 將 list 的元素組合在一起了# 第三種方法,轉化為數據框# 使用更靈活的data.tabledt = as.data.table(before)as.list(data.table(t(dt)))dt = as.data.table(l)as.list(data.table(t(dt)))dt = as.data.frame(l) # 這時可以用data.frameas.list(data.table(t(dt)))# 使用data.frame也可以,但是要先轉化為矩陣new <- do.call(rbind, before) as.list(data.frame(new))


文末彩蛋

最後一次推薦 rstudio 快捷鍵

更多快捷鍵在 rstudio 菜單欄中的 help-keyboard shortcuts help 中查詢

公眾號後臺回復關鍵字即可學習

回復 爬蟲            爬蟲三大案例實戰  
回復 Python       1小時破冰入門

回復 數據挖掘     R語言入門及數據挖掘
回復 人工智慧     三個月入門人工智慧
回復 數據分析師  數據分析師成長之路 
回復 機器學習      機器學習的商業應用
回復 數據科學      數據科學實戰
回復 常用算法      常用數據挖掘算法

相關焦點

  • R語言數據清洗實戰——高效list解析方案
    好在確實有開發者在針對list數據結構進行操作上的優化,任坤老師的大作——rlist就是一個強大的list解析神器,它可以讓我們像在dplyr、data.table操作data.frame一樣,使用rlist輕鬆的實現對list數據類型的map(映射)、filter(篩選)、update(更新)、group(分組)、sort(排序)。
  • R 數據處理(十九)—— purrr
    R 數據處理(十九)5. map 函數遍歷向量,並對向量中每個元素執行函數操作,最後返回結果的模式是非常普遍的。假設您希望將線性模型擬合到數據集中的每個組,下面的示例將 mtcars 數據集分割為三個部分(每個圓柱體的值一個),並對每個部分擬合相同的線性模型models <- mtcars %>%   split(.
  • R語言-初識與數據結構
    關於S語言更多信息見:http://cm.bell-labs.com/cm/ms/departments/sia/S/history.htmlScheme語言:Scheme 語言是計算機表面處理語言,該語言用於處理包含有表格的數據的程式語言,被廣泛地運用於人工智慧研究。
  • R數據處理|data.table篇(三)
    本文為data.table包介紹最後一篇,前兩篇連結如下R數據處理|data.table篇(一) - 知乎專欄R數據處理|data.table篇(二) - 知乎專欄本文主要講解data.table包中一些比較不常用的函數,還有data.table包高效的深層原理。
  • 轉置,在數據查詢中的利用方法
    大家好,今日繼續講解VBA資料庫解決方案,今日講解的是第72講,內容是:轉置函數在查詢中的利用。數據處理的結果是要形成一個比較好看易懂的報表,如何能做出我們需要的格式,這就要我們靈活的運用所學到的知識,大膽的進行嘗試。今天講的是轉置函數,這個函數在數組中經常的用到,我們看看在資料庫中,這個函數是怎麼利用的 。
  • R語言數據處理方法~小結
    R自帶函數2. reshape2數據重構3. dplyr4. tidyr5. 字符串處理1. R自帶函數1.1 轉置使用函數t()可對一個矩陣或數據框進行轉置,對於數據框,行名將變成變量(列)名。也可以在列表中為各組聲明自定義的名稱,例如by=list(Group.cyl=cyl,Group.gears=gear)。
  • Python自動化測試—使用Pandas來高效處理測試數據
    >df = pd.read_excel('lemon_cases.xlsx', sheet_name='multiply')print(df)# 1.讀取一列數據# df["title"] 返回一個Series對象,記錄title這列的數據print(df["title"])# Series對象能轉化為任何序列類型和dict
  • 數據類型介紹——tuple、list和range對象
    使用list()函數可以將字符串、元組等其它類型的數據轉化為列表,若傳入字典,則可以將字典的鍵轉化為列表:In [5]: list('abc') Out[5]: ['a', 'b', 'c']In [6]: list({'jack': 98, 'gudo': 27, 'rv': 41}) Out[6]: ['jack', 'gudo
  • R語言的數據管理
    判斷:is.na注意:缺失值不可比較,無法用比較運算符檢測;R語言有專門符號來表示無限大(+ inf,-inf)和不可能的值(NaN)分析中注意各個函數對缺失值的處理,可以使用na.omit()刪除所有含有缺失數據的行。
  • [Excel]快速實現數據轉置的三種方法
    數據轉置是Excel中經常會遇上的需求,但你會幾種呢?具體操作的話,只需要在複製完內容後,選擇目標起始單元格位置,然後點擊「選擇性粘貼」->勾選「轉置」,即可。優點:既簡單又快 ,入門首選。缺點:對Excel表格無效(見下圖)
  • R數據處理基礎篇(一)
    先用幾個問題檢驗一下你是否需要看這篇文章在使用R做數據分析的一個完整的過程包括數據的獲取,數據的前期處理,之後才是使用「整齊」的數據來套用模型得出結論。本專題旨在系統地講述使用R語言完成前期的數據處理,英文叫tidy data,將「髒」數據洗乾淨。
  • 全棧數據之R語言常用包和函數
    、缺失值處理等。本文為 Rstudio 社區文章《Quick list of useful R packages》的中文翻譯。略有增刪。RODBC, RMySQL, RPostgresSQL, RSQLite :從資料庫中讀取加載數據數據處理數據處理裡面提到的R包都是Rstudio公司旗下的。
  • 用plantlist程序包查詢和處理植物學名
    R軟體中,類似的程序包還有 taxize (https://cran.r-project.org/web/packages/taxize/index.html)、Taxonstand(https://cran.r-project.org/web/packages/Taxonstand/index.html)等。
  • R語言-data.table-數據處理
    data.table 包數據處理data.table 包數據處理前言基礎介紹基本格式i j by 使用讀取數據行篩選列篩選總結
  • R數據處理|data.table篇(一)
    data.table包是一個超高性能處理包,在數據處理上代碼異常簡潔,速度非常快。由於data.table的語法主要基於[],有些用法和基礎函數會不一致,所以沒有放在前面兩個專題中一起講,而是單獨拿出來講。在這個系列裡,我會詳細說明data.table和基礎函的差異,並系統地講解data.table包的用法。
  • 記錄集賦值給數組後,利用轉置函數處理多維數組的方法
    大家好,今日繼續講解VBA資料庫解決方案,今日講解的是第76講,內容是:記錄集賦值給數組後,利用轉置函數處理多維數組的方法。我在第一冊的第43講中,我講了將記錄集存入數組的方案,並通過一個Index函數在工作表中恢復數組數據的方法。今日講的是利用轉置函數來完成同樣的功能。
  • 附代碼|詳解R語言的高級數據結構
    有時數據需要比向量更複雜的存儲方式。幸運的是,R軟體提供了很多的數據結構。常見的有數據框(data.frame)、矩陣(matrix)、列表(list)以及數組(array)。數據框類似於電子表格,矩陣類似於人們熟悉的矩陣數學計算,列表對於程式設計師比較熟悉。
  • 用R也可以跑Python了
    如果你主要從事數據分析、統計建模和可視化,R大概是你的不二之選。但如果你還想來搞點深度學習,整個自然語言處理,那你可還真得用Python。如果你處於交叉領域,很可能就需要兩種語言切換。最近的KDnuggets Analytics的軟體調查中,Python和R位居數據科學和機器學習軟體的前兩名。如果你真的想提高你在數據科學領域的能力,這兩種語言你確實都應該學習。
  • R語言-stringr-字符串處理
    R包stringr處理字符相對簡單,尤其是我常用Power BI,但是對M語言不熟悉,不會處理字符數據,往往我就先利用R清洗字符數據列。本文記錄工作中常用的字符處理函數,部分案例照搬R for Data Science的字符部分。