如何使用cbind从列表中添加索引?

时间:2018-06-14 09:55:15

标签: r

我的数据如下:

lis=list(NULL, NULL, structure(c("A", "30", "5"), .Dim = c(3L, 1L), .Dimnames = list(
         c("Name", "M", "E") , "foo")), structure(c("B", "19", 
         "9"), .Dim = c(3L, 1L), .Dimnames = list(c("Name", "M", "E"), "foo")))

结合:

dat=do.call(cbind, lis)

这里我想用真正的对应关系(来自lis的索引)替换foo

期望的输出:

       3      4 
 Name "A"  "B" 
 M    "30" "19"
 E    "5"  "9" 

2 个答案:

答案 0 :(得分:2)

你可以做到

as.data.frame(Filter(Negate(is.null), lis))
#     foo foo.1
#Name   A     B
#M     30    19
#E      5     9

说明:在将条目转换为Filter(Negate(is.null), lis)之前,NULL会从list中删除data.frame个条目。

使用list条目的索引替换列名

setNames(
    data.frame(Filter(Negate(is.null), lis)), 
    which(sapply(lis, function(x) !is.null(x))))
#      3  4
#Name  A  B
#M    30 19
#E     5  9

答案 1 :(得分:2)

如果我理解正确,您希望标签dat的列与索引中lis的方式相匹配。但是,lis没有名称,只有输出中显示的自动编号。您可以使用seq_along进行模拟并过滤掉NULL元素:

colnames(dat) <- seq_along(lis)[!sapply(lis,is.null)]
dat
     3    4   
Name "A"  "B" 
M    "30" "19"
E    "5"  "9"

如果lis确实有名称,您可以使用names(lis)代替seq_along