r - 将列表列表转换为数据框
问题描述
我有一个包含许多其他列表的列表,每个列表都包含不同数量的字符向量和不同数量的元素。我想创建一个数据框,其中每个列表将表示为一行,并且该列表中的每个字符向量将是一列。如果字符向量具有 > 1 个元素,则这些元素将使用“+”号连接和分隔,以便可以将它们存储为一个字符串。数据如下所示:
fruits <- list(
list(c("orange"), c("pear")),
list(c("pear", "orange")),
list(c("lemon", "apple"),
c("pear"),
c("grape"),
c("apple"))
)
预期的输出是这样的:
fruits_df <- data.frame(col1 = c("orange", "pear + orange", "lemon + apple"),
col2 = c("pear", NA, "pear"),
col3 = c(NA, NA, "grape"),
col4 = c(NA, NA, "apple"))
一个列表可以包含的字符向量的个数没有限制,所以解决方案需要动态创建列,导致列数等于包含最大字符数的列表长度的df向量。
解决方案
这有点乱,但这是一种方法
cols <- lapply(fruits, function(x) sapply(x, paste, collapse=" + "))
ncols <- max(lengths(cols))
dd <- do.call("rbind.data.frame", lapply(cols, function(x) {length(x) <- ncols; x}))
names(dd) <- paste0("col", 1:ncol(dd))
dd
# col1 col2 col3 col4
# 1 orange pear <NA> <NA>
# 2 pear + orange <NA> <NA> <NA>
# 3 lemon + apple pear grape apple
或其他策略
ncols <- max(lengths(fruits))
dd <- data.frame(lapply(seq.int(ncols), function(x) sapply(fruits, function(y) paste(unlist(y[x]), collapse=" + "))))
names(dd) <- paste0("col", 1:ncols)
dd
但实际上,您需要从列表中构建每一列或每一行,然后将它们组合在一起。
推荐阅读
- amazon-web-services - Cloud9 和 CloudFormation - 访问 EC2 实例
- python - PyQt5在关闭后从Qdialog窗口获取值到主窗口
- c++ - 如何优雅地切割物体
- node.js - heroku 节点部署(react-boilerplate) sh: 1: node-pre-gyp: not found 错误
- javascript - 在打字稿角度5中同步
- linux - 如何找到每个节点(分支)的树的最大深度
- java - 我无法在硒中找到元素
- c++ - 特定数据类型的模板类
- python - 重塑/填充 Numpy 数组 - Python
- python - 格式化数据集的问题