r - 将列表列表转换为单个数据框,第一列由 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)
我认为这让我更接近,但我仍然不确定如何将第一个节点值分配给相应的特征值。我知道这可能是一个简单的任务,但它今天难倒我!
解决方案
也许你可以试试下面的代码
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
推荐阅读
- sql - 使用 CTE 显示数据中的传递关系
- c - 如何要求 autotools 项目/获取 autotools 包的 cflags?
- javascript - 如何在 html 文件 ionic cordova 移动应用程序中显示模板
- c# - 如何在 C# 控制台中显示数据表?
- gpu - 金属着色器功能中的故意无限循环不会阻塞 GPU
- firebase - 三天后 Cloud Storage 下载 URL 失败,可能是由于 Content-Type?
- c++11 - x86 mfence 和 C++ 内存屏障
- java - Android WebView 和 Word Online
- python - 无法使用 sqlalchemy 建立连接 SQL Server
- python - 查找从一个顶点到另一个顶点的所有路径