压平数据框

时间:2012-02-27 15:11:44

标签: r nested dataframe flatten

我有这个嵌套数据框

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

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

2 个答案:

答案 0 :(得分:15)

这一行可以解决问题:

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"

答案 1 :(得分:5)

这不是答案,而是保罗回答的后续/补充:

在任何迭代次数上,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

再次感谢分享保罗!

在运行R 2.14.1的win 7计算机上使用rbenchmark进行基准测试