【问题标题】:Combine rownames from different lists in a dataframe在数据框中组合来自不同列表的行名
【发布时间】:2011-08-03 11:13:20
【问题描述】:

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

x

[[1]]
  A  1   3
  B  4   2

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

A、B、C 和 D 是列表中的行名。现在我想创建一个仅将行名粘贴到数据框中的文件。数据框中的每一行在总列表中包含 1 个列表。

A B 
C D E

谁能帮我解决这个问题?我想也许像 do.call(rbind, rownames(x))

编辑! 05-08-2011

有没有办法按列表保存行名列表?那么最终数据中没有NA并且数据不相等?

谢谢大家!

【问题讨论】:

  • 你能发布str(x)的输出吗?您在列表中显示的内容是什么类型的对象。在第 1 行第 3 列有空格的地方你想要什么?数据框必须有一些东西,但可以使用您显示的列表。

标签: list r dataframe


【解决方案1】:

假设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 中的一个选项。

【讨论】:

    【解决方案2】:

    应该这样做:

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

    这会产生一个向量,其中每个元素都是列表元素的空格分隔的行名。

    【讨论】:

    • 当然按照他的要求去做。他的书面表达是否符合他的意图似乎还悬而未决。
    【解决方案3】:

    您的样本数据:

    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))
    

    【讨论】:

    • 亲爱的 Richie,解决方案是正确的,我想要行名,但唯一的是,我想要第一行的字母 A 和 B,第二行的 C D 和 E。这可能吗?
    • @Lisann 正如我在对你的 Q 的评论中提到的,除非你告诉我们你想用什么来填充第一行,否则这是无法做到的?您不能在 R 中拥有具有不同长度行的矩阵或数据框。
    • 好吧,我认为是这样的,因为所有的错误。还有其他方法吗,比如使用 NA 来保存数据?
    • 是的。我将使用NA 填充步骤来更新我的答案。
    猜你喜欢
    • 2018-10-21
    • 2012-02-04
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多