【问题标题】:Converting a list to one row data.frame将列表转换为一行 data.frame
【发布时间】:2012-11-26 15:19:10
【问题描述】:

我有一个这样的列表:

arg0 <- list(code = "a", n = rep(10, 3))

列表中的对象数量是可变的。列表的对象是向量——只有一维对象。

我想制作一个程序将列表转换为单行 data.frame,如下所示:

> data.frame(code = "a", n.1 = 10, n.2 = 10, n.3 = 10)
  code n.1 n.2 n.3
1    a  10  10  10

我目前有这个解决方案:

a <- stack(arg0)
b <- data.frame(t(a[,1]))
names(b) <- a[,2]
b <- data.frame(b)

b 几乎就是我想要达到的结果:

> b
  code  n n.1 n.2
1    a 10  10  10

两个问题:

  1. 有没有更优雅的方式来实现结果?
  2. 您知道如何获取像c(n.1, n.2, n.3) 这样的重复列名的编号吗?

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    如果要保留列表对象的不同数据类型,可以使用以下命令:

    data.frame(lapply(arg0, function(x) t(data.frame(x))))
    

    输出:

      code n.1 n.2 n.3
    x    a  10  10  10
    

    第二到第四列的值仍然是数字。

    【讨论】:

    • 由于保留数据类型而被接受——我没有在问题中提出的额外功能,但我正在考虑它。令我惊讶的是,对象的命名是如何在 R 中组织的。在这两个示例中,不同的行名被分配给相同的结果:foo &lt;- function(x) t(data.frame(x)); foo(arg0[[1]])t(data.frame(arg0[[1]]))。也不知道lapply 保留了参数列表中的对象名称。感谢您的教育回答!
    • 另一个类似的解决方案:data.frame(lapply(arg0, function(x) t(matrix(x))))
    【解决方案2】:

    这是一种方式:

    data.frame(t(unlist(arg0)))
    #   code n1 n2 n3
    # 1    a 10 10 10
    

    【讨论】:

    • 这行不通,因为它会使 10 成为一个因素。 x
    【解决方案3】:

    您可以对转置的未列出数据使用write.tableread.table 的组合。我使用剪贴板作为中间步骤来固定表格。

    write.table(t(unlist(arg0)),"clipboard")
    read.table("clipboard")
      code n1 n2 n3
    1    a 10 10 10
    

    【讨论】:

    • 这行不通,因为它会使 10 成为一个因素。 ``` x
    • @TalGalili read.table 将以通常的方式重新解释数据。
    • 但这依赖于 read.table 在字符向量上做出好的选择。如果 n 有一个因素,它会起作用吗?
    • 如果默认选项不合适,您可以使用colClasses 指定选项,并在一定程度上使用stringsAsFactors 指定选项
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多