簡體   English   中英

將具有不同數量元素的列表轉換為數據幀

[英]Transforming a list with differing number of elements to a data frame

我正在嘗試通過將數據框與列表結合來創建數據框。 問題在於列表的每個元素的長度都不相同。 我閱讀了此鏈接: http : //www.r-bloggers.com/converting-a-list-to-a-data-frame/,而示例四正是我所需要的,但我想自動命名行。 我有超過100行需要命名,但我不想明確命名它們。

example <- list("a", c("b", "c"), c("d", "e", "f"))

應該看起來像這樣:

row1 | a <NA> <NA>
row2 | b  c   <NA>
row3 | d  e    f

我們可以使用stri_list2matrixlist轉換為matrix 它將為length小於list max長度的list元素填充NA

library(stringi)
stri_list2matrix(example, byrow=TRUE)
#    [,1] [,2] [,3]
#[1,] "a"  NA   NA  
#[2,] "b"  "c"  NA  
#[3,] "d"  "e"  "f" 

另一個選擇是從base R ,我們將length分配給最大長度,從而為長度較短的list元素填充NA。 我們使用sapply以便當list元素的長度相等時,將其simplifymatrix

t(sapply(example, `length<-`, max(lengths(example))))
#   [,1] [,2] [,3]
#[1,] "a"  NA   NA  
#[2,] "b"  "c"  NA  
#[3,] "d"  "e"  "f" 

注意:此處不使用任何軟件包...如果需要data.frame ,請使用as.data.frame包裝輸出。

將每個列表組件轉換為"ts"類對象, cbindcbind"mts"類對象(這將填充NA),並轉置以給出字符矩陣mat 設置行名稱。 最后將其轉換為數據幀。 不使用任何軟件包。

mat <- t(do.call(cbind, Map(ts, example)))
rownames(mat) <- paste0("row", seq_along(example)) ##
DF <- as.data.frame(mat, stringsAsFactors = FALSE) ###

給予:

> DF
     V1   V2   V3
row1  a <NA> <NA>
row2  b    c <NA>
row3  d    e    f

注意:該問題要求提供數據框和行名; 但是,如果不需要行名,則省略標記為##的行,如果字符矩陣已足夠,則省略標記為###的行。

更新 stringAsFactors的固定拼寫。 也略作簡化,添加注釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM