假设我们有这样一个列表:

l <- list()
l[[1]] <- list()
l[[2]] <- list()
l[[3]] <- list()

names(l) <- c("A", "B", "C")

l[[1]][[1]] <- data.frame(6)
l[[1]][[2]] <- data.frame(3)
l[[1]][[3]] <- data.frame(8)
l[[1]][[4]] <- data.frame(7)

l[[2]][[1]] <- data.frame(5)
l[[2]][[2]] <- data.frame(4)
l[[2]][[3]] <- data.frame(7)
l[[2]][[4]] <- data.frame(9)

l[[3]][[1]] <- data.frame(1)
l[[3]][[2]] <- data.frame(6)
l[[3]][[3]] <- data.frame(2)
l[[3]][[4]] <- data.frame(8)

names(l[[1]]) <- c("aa", "bb", "cc", "dd")
names(l[[2]]) <- c("aa", "bb", "cc", "dd")
names(l[[3]]) <- c("aa", "bb", "cc", "dd")

我想创建一个包含4个元素的列表l2:aabbccdd.这些元素中的每一个都是数据帧,其中包含列表l中的aabbccdd的值,以及一个ID变量,该变量指示元素是否来自列表l中的ABC元素.因此,如果我们从头开始构建最终结果,它将如下所示:

l2 <- list()

l2[[1]] <- data.frame(Value = c(6, 5, 1), ID = c("A", "B", "C"))
l2[[2]] <- data.frame(Value = c(3, 4, 6), ID = c("A", "B", "C"))
l2[[3]] <- data.frame(Value = c(8, 7, 2), ID = c("A", "B", "C"))
l2[[4]] <- data.frame(Value = c(7, 9, 8), ID = c("A", "B", "C"))

names(l2) <- c("aa", "bb", "cc", "dd")

然而,我不能从头开始构建它,而是必须"reshape "ll2.最好的方法是什么?首选的解决方案是purrr.

推荐答案

keys 是transpose().您可以在内部map_dfr()中设置.id = "ID",以创建一个新的列ID,记录子列表的名称,当行将每个元素绑定在一起时,每个值都出现在子列表中.

library(purrr)

l %>%
  transpose() %>%
  map(~ map_dfr(.x, set_names, "Value", .id = "ID"))
Output
$aa
  ID Value
1  A     6
2  B     5
3  C     1

$bb
  ID Value
1  A     3
2  B     4
3  C     6

$cc
  ID Value
1  A     8
2  B     7
3  C     2

$dd
  ID Value
1  A     7
2  B     9
3  C     8

R相关问答推荐

查找满足SpatRaster中条件的单元格位置

提取R中值和列名的所有可能组合

寻找图片边缘

编辑文件后编辑RhandsonTable

如何删除gggvenn与gggplot绘制的空白?

如何在R中添加截止点到ROC曲线图?

更改默认系列1以更改名称

如何在kableextra调用cell_spec()中忽略NA?

使用范围和单个数字将数字与字符串进行比较

跨列查找多个时间报告

将项粘贴到向量中,并将它们分组为x的倍数,用空格分隔

在纵向数据集中创建新行

Geom_arcbar()中出错:找不到函数";geom_arcbar";

如何使用FormC使简单算术运算得到的数字是正确的?

为什么不能使用lApply在包装函数中调用子集

如何用不同长度的向量填充列表?

网络抓取NBA.com

希望解析和复制R中特定模式的数据

使用相对风险回归计算RR

R中刻面网格中的排序条形图