首页 > 解决方案 > 将列表列表转换为单个数据框,第一列由 R 中的第一个值(对于每个列表)填充

问题描述

我有一个列表列表,如下所示:

x <-list()
x[[1]] <- c('97', '342', '333')
x[[2]] <- c('97','555','556','742','888')
x[[3]] <- c ('100', '442', '443', '444', '445','446')

每个列表中的第一个数字(97、97、100)指的是树中的一个节点,后面的数字指的是与该节点关联的特征。

我的目标是创建一个如下所示的数据框:

df= data.frame(node = c('97','97','97','97','97','97','100','100','100','100','100'),
               trait = c('342','333','555','556','742','888','442','443','444','445','446'))

其中每个特征都有其对应的节点。

我认为我需要做的第一件事是将列表列表转换为单个数据框。我试过这样做使用:

do.call(rbind,x)

但这会重复 x[[1]] 和 x[[2]] 中的值以匹配 x[[3]] 的长度。我也尝试过使用:

dt_list <- map(x, as.data.table)
dt <- rbindlist(dt_list, fill = TRUE, idcol = T)

我认为这让我更接近,但我仍然不确定如何将第一个节点值分配给相应的特征值。我知道这可能是一个简单的任务,但它今天难倒我!

标签: rlistdata-binding

解决方案


也许你可以试试下面的代码

h <- sapply(x, `[`,1)
d <- lapply(x, `[`,-1)
df <- data.frame(node = rep(h,lengths(d)), trait = unlist(d))

这样

> df
   node trait
1    97   342
2    97   333
3    97   555
4    97   556
5    97   742
6    97   888
7   100   442
8   100   443
9   100   444
10  100   445
11  100   446

推荐阅读