r-将具有两列的lst转换为数据帧


vol=list() ;df=data.frame(name=c(5,2,15,4),name=c(2,0,1,2))
vol[[1]] <- dplyr::lst(!! names(df)[1] := df)
df2=data.frame(dat=c(5,2,15,4),dat=c(2,0,1,2))
vol[[2]] <- dplyr::lst(!! names(df2)[1] := df2)

如何将此列表(vol(转换为如下的adata框架:

A     Par    var   
name    5      2
name    2      0
name   15      1
name    4      2
dat    5     2
dat   2     0
dat  15     1
dat   4     2

在与map_dfr绑定之前,我们可能需要将list中的列名修改为commmon名称('Par','var'(。由于它是嵌套的list,(如果它是嵌套列表,则首先为flatten(,然后进行更改。如果我们需要内部列表名称作为列,请使用.id创建具有列表名称的列

library(dplyr)
library(purrr)
vol2 %>%   
map_dfr(~ .x %>% rename_all(~ c("Par", "var")), .id = "A")

-输出

A Par  var
1  name  11   17
2  name  23   12
3  name  94  123
4  name  32   11
5  name   7  117
6  B.Ch  11   10
7  B.Ch  96   10
8  B.Ch   8   10
9  B.Ch  68  133
10 B.Ch   5 1167

或者在base R中使用相同的方法,用c压平,用lapplylist上循环以重命名,然后用Mapcbind创建一列,最后用rbind创建list元素

lst1 <- lapply(vol2, setNames, c("Par", "var"))
dat <- do.call(rbind, Map(cbind, A = names(lst1), lst1))
row.names(dat) <- NULL

-输出

> dat
A Par  var
1  name  11   17
2  name  23   12
3  name  94  123
4  name  32   11
5  name   7  117
6  B.Ch  11   10
7  B.Ch  96   10
8  B.Ch   8   10
9  B.Ch  68  133
10 B.Ch   5 1167

数据

vol2 <- list(name = structure(list(name = c(11, 23, 94, 32, 7), name.1 = c(17, 
12, 123, 11, 117)), class = "data.frame", row.names = c(NA, 5L
)), B.Ch = structure(list(B.Ch = c(11, 96, 8, 68, 5), B.Ch.1 = c(10, 
10, 10, 133, 1167)), class = "data.frame", row.names = c(NA, 
5L)))

最新更新