非常类似于我的问题here。
给出一个命名为list
的元素,其中每个元素代表data.frame
中的一行,一个元素可能是list
或类似的类,例如data.frame
,那么如何将其转换为合适的data.frame
类对象以[[简洁的方式
library(data.table)
df_list <- lapply(1:10, function(x)list(a = 1, b = 'hello',
c = 3 - 1i,
d = data.table(e = 1:3,
f = LETTERS[1:3])))
names(df_list) <- LETTERS[1:10]
预期输出
data.table
列或rownames
交换为data.frame
对象。d <- lapply(1:10, function(x)data.table(e = 1:3, f = LETTERS[1:3]))
df <- tibble(a = rep(1, 10), b = rep('hello', 10), c = rep(3 - 1i, 10), d = d)
df$rownames <- LETTERS[1:10]
注意:
data.table::rbindlist(df_list, fill = TRUE)
和dplyr::bind_rows(df_list)
原始格式失败。
unnest_wider
library(dplyr)
library(tidyr)
library(tibble)
tibble(col1 = df_list, rn = names(col1)) %>%
unnest_wider(c(col1))
# A tibble: 10 x 5
# a b c d rn
# <dbl> <chr> <cpl> <list> <chr>
# 1 1 hello 3-1i <data.table[,2] [3 × 2]> A
# 2 1 hello 3-1i <data.table[,2] [3 × 2]> B
# 3 1 hello 3-1i <data.table[,2] [3 × 2]> C
# 4 1 hello 3-1i <data.table[,2] [3 × 2]> D
# 5 1 hello 3-1i <data.table[,2] [3 × 2]> E
# 6 1 hello 3-1i <data.table[,2] [3 × 2]> F
# 7 1 hello 3-1i <data.table[,2] [3 × 2]> G
# 8 1 hello 3-1i <data.table[,2] [3 × 2]> H
# 9 1 hello 3-1i <data.table[,2] [3 × 2]> I
#10 1 hello 3-1i <data.table[,2] [3 × 2]> J
或者如果我们想使用data.table
,我们可以在list
上循环,然后将原子元素转换为data.table
并创建一个非原子列,然后使用rbindlist
library(data.table) rbindlist(lapply(df_list, function(x) { i1 <- sapply(x, is.data.table) as.data.table(x[!i1])[, names(x)[i1] := x[i1]] }), idcol= 'rn') # rn a b c d # 1: A 1 hello 3-1i <data.table> # 2: B 1 hello 3-1i <data.table> # 3: C 1 hello 3-1i <data.table> # 4: D 1 hello 3-1i <data.table> # 5: E 1 hello 3-1i <data.table> # 6: F 1 hello 3-1i <data.table> # 7: G 1 hello 3-1i <data.table> # 8: H 1 hello 3-1i <data.table> # 9: I 1 hello 3-1i <data.table> #10: J 1 hello 3-1i <data.table>