【问题标题】:flatten a data frame展平数据框
【发布时间】:2012-03-17 01:29:05
【问题描述】:

我有这个嵌套的数据框

test <- structure(list(id = c(13, 27), seq = structure(list(
`1` = c("1997", "1997", "1997", "2007"),
`2` = c("2007", "2007", "2007", "2007", "2007", "2007", "2007")), 
.Names = c("1", "2"))), .Names = c("penr", 
"seq"), row.names = c("1", "2"), class = "data.frame")

我想要第二列中所有值的列表,即

result <- c("1997", "1997", "1997", "2007", "2007", "2007", "2007", "2007", "2007", "2007", "2007")

有没有简单的方法来实现这一点?

【问题讨论】:

    标签: r nested dataframe flatten


    【解决方案1】:

    这一行可以解决问题:

    do.call("c", test[["seq"]])
    

    或同等学历:

    c(test[["seq"]], recursive = TRUE)
    

    甚至:

    unlist(test[["seq"]])
    

    这些函数的输出是:

        11     12     13     14     21     22     23     24     25     26     27 
    "1997" "1997" "1997" "2007" "2007" "2007" "2007" "2007" "2007" "2007" "2007" 
    

    要删除字符向量上方的名称,请在结果对象上调用 as.character

    > as.character((unlist(test[["seq"]])))
     [1] "1997" "1997" "1997" "2007" "2007" "2007" "2007" "2007" "2007" "2007"
    [11] "2007"
    

    【讨论】:

    • 你能在我的答案下面打勾吗?这样,每个人都知道这个问题已经得到解答(我得到了一些代表:))
    • 当然 - 但由于堆栈交换的限制,我必须等待几分钟。你太快了:)
    • 对于这类问题,一个人必须很快,我很惊讶没有其他答案没有同时发布,例如@Andrie ;)。
    • 我通常在这种情况下使用 unlist ,因为我不知道还有其他选择。感谢分享。 Unlist 实际上是三种方法中最慢的。 +1
    • @TylerRinker,如果你有一些基准,请发布它们,因为我认为这会很有趣。
    【解决方案2】:

    这不是答案,而是对 Paul 答案的跟进/补充:

    在任意数量的迭代中,c 方法始终表现最佳。然而,当我将迭代次数增加到 100000 次时,unlist 从最差到非常接近 c 方法。

    1000 次迭代

         test replications elapsed relative user.self sys.self user.child sys.child
    2       c         1000    0.04 1.333333      0.03        0         NA        NA
    1 do.call         1000    0.03 1.000000      0.03        0         NA        NA
    3  unlist         1000    0.23 7.666667      0.04        0         NA        NA
    

    100,000 次迭代

         test replications elapsed relative user.self sys.self user.child sys.child
    2       c       100000    8.39 1.000000      3.62        0         NA        NA
    1 do.call       100000   10.47 1.247914      4.04        0         NA        NA
    3  unlist       100000    9.97 1.188319      3.81        0         NA        NA
    

    再次感谢分享 Paul!

    在运行 R 2.14.1 的 win 7 机器上使用 rbenchmark 执行基准测试

    【讨论】: