组合数据框中不同列表的rownames

时间:2011-08-03 11:13:21

标签: list r dataframe

我对R中的列表有疑问。我在16列表中有一个列表,其中包含一个包含如下变量的列表:

x

[[1]]
  A  1   3
  B  4   2

[[2]]
  C  23  4
  D  9   22
  E  4   54

A,B,C和D是列表中的rownames。现在我想创建一个只粘贴数据帧中的rownames的文件。数据框中的每一行在总列表中包含1个列表。

A B 
C D E

任何人都可以帮我吗?我想也许有些像do.call(rbind,rownames(x))

修改! 2011年5月8日

有没有办法按列表保存rownames列表?那么最终数据中没有NA,数据是不相等的?

谢谢大家!

3 个答案:

答案 0 :(得分:3)

假设x的性质,如果我们使用:

x <- list(matrix(c(1,4,3,2), ncol = 2, 
                 dimnames = list(c("A","B"), NULL)), 
          matrix(c(23,9,4,4,22,54), ncol = 2, 
                 dimnames = list(c("C","D","E"), NULL)))

给出:

> x
[[1]]
  [,1] [,2]
A    1    3
B    4    2

[[2]]
  [,1] [,2]
C   23    4
D    9   22
E    4   54

然后

> lapply(x, rownames)
[[1]]
[1] "A" "B"

[[2]]
[1] "C" "D" "E"

似乎是唯一合理的答案。除非我们用某些东西填充("A","B")向量,否则我们不能使用矩阵或数据帧,因为组件长度不匹配。因此do.call()想法失败的原因之一是:

> do.call(rbind, rownames(x))
Error in do.call(rbind, rownames(x)) : second argument must be a list
> do.call(rbind, lapply(x, rownames))
     [,1] [,2] [,3]
[1,] "A"  "B"  "A" 
[2,] "C"  "D"  "E" 
Warning message:
In function (..., deparse.level = 1)  :
      number of columns of result is not a multiple of vector length (arg 1)

要使用NA填充结果并获取数据框,我们可以执行以下操作:

out <- lapply(x, rownames)
foo <- function(x, max, repl = NA) {
    if(length(x) == max)
        out <- x
    else {
        out <- rep(repl, max)
        out[seq_along(x)] <- x
    }
    out
}
out <- lapply(out, foo, max = max(sapply(out, length)))
(out <- do.call(rbind, out))

最后一行给出:

> (out <- do.call(rbind, out))
     [,1] [,2] [,3]
[1,] "A"  "B"  NA  
[2,] "C"  "D"  "E"

如果你想要那么好的印刷,那么

> print(format(out), quote = FALSE)
     [,1] [,2] [,3]
[1,] A    B    NA  
[2,] C    D    E

是R内的一个选项。

答案 1 :(得分:1)

这应该这样做:

lapply(x, function(curdfr){paste(rownames(curdfr))})

这会生成一个向量,每个元素都是列表元素的空格分隔的rownames。

答案 2 :(得分:0)

您的样本数据:

x <- list(
  matrix(c(1,4,3,2), nrow = 2, dimnames = list(LETTERS[1:2])),
  matrix(c(23,9,4,4,22,54), nrow = 3, dimnames = list(LETTERS[3:5]))
)

你想要什么:

unlist(lapply(x, rownames))

或者,如果您热衷于do.call,那么这相当于:

do.call(c, lapply(x, rownames))