来自嵌套行列表的数据框,带有类列表的列

问题描述 投票:1回答:1

非常类似于我的问题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)原始格式失败。

r list dataframe data.table
1个回答
1
投票
我们可以使用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>

© www.soinside.com 2019 - 2024. All rights reserved.