[英]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_list2matrix
將list
轉換為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
元素的長度相等時,將其simplify
為matrix
。
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"
類對象, cbind
其cbind
為"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.