簡體   English   中英

如何將表列表轉換為 R 中的 data.frame?

[英]How can I convert a list of tables to a data.frame in R?

有一個命名列表,例如:

set.seed(1)
list <- list(table(sample(LETTERS[1:10], 50, replace = T)), table(sample(LETTERS[1:20], 50, replace = T)))
names(list) <- LETTERS[1:2]

如何將此列表轉換為一個數據框,用元素名稱填充空白?

例如,由於行號不同,下面的代碼會出錯:

as.data.frame(list)

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
  arguments imply differing number of rows: 10, 18

通過這樣做可以手動為這個小表:

rbind(data.frame(Name = "A", Letters = list$A), data.frame(Name = "B", Letters = list$B))
   Name Letters.Var1 Letters.Freq
1     A            A            3
2     A            B            3
3     A            C            3
4     A            D            4
5     A            E            6
6     A            F            6
7     A            G            6
8     A            H            3
9     A            I            8
10    A            J            8
11    B            A            3
12    B            B            2
13    B            D            1
14    B            F            4
15    B            G            5
16    B            H            4
17    B            I            1
18    B            J            3
19    B            K            3
20    B            L            3
21    B            M            4
22    B            N            3
23    B            O            1
24    B            P            4
25    B            Q            2
26    B            R            2
27    B            S            4
28    B            T            1

你知道如何為有幾十個表的列表縮放這個嗎?

謝謝您的幫助。

您可以使用purrrmap_df

result <- purrr::map_df(list, as.data.frame, .id = 'Name')
result

#   Name Var1 Freq
#1     A    A    3
#2     A    B    3
#3     A    C    3
#4     A    D    4
#5     A    E    6
#6     A    F    6
#7     A    G    6
#8     A    H    3
#9     A    I    8
#10    A    J    8
#11    B    A    3
#12    B    B    2
#13    B    D    1
#14    B    F    4
#15    B    G    5
#16    B    H    4
#17    B    I    1
#18    B    J    3
#19    B    K    3
#20    B    L    3
#21    B    M    4
#22    B    N    3
#23    B    O    1
#24    B    P    4
#25    B    Q    2
#26    B    R    2
#27    B    S    4
#28    B    T    1

基礎 R 有點冗長,但可以通過以下方式實現:

tmp <- lapply(list, as.data.frame)
do.call(rbind, Map(cbind, Name = names(tmp), tmp))

如果您更喜歡data.table

library(data.table)
rbindlist(Map(stack,list),idcol = "Name")
#   Name values ind
# 1:    A      3   A
# 2:    A      3   B
# 3:    A      3   C
# 4:    A      4   D
# 5:    A      6   E
# 6:    A      6   F
#...

暫無
暫無

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

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