数据框展平

18

我有一个嵌套的数据框

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个回答

16

这行代码可以解决问题:

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"

你能在我的答案下方打个勾吗?这样每个人都知道这个问题已经得到了解答(而且我也能获得一些声望):) - Paul Hiemstra
当然可以-但是由于stack exchange的限制,我需要等几分钟。你太快了 :) - speendo
在这种问题上,人们必须要快速,我很惊讶其他人比如@Andrie没有同时发布答案。 - Paul Hiemstra
我通常在这种情况下使用unlist,因为我不知道有其他的选择。谢谢分享。实际上,unlist是三种方法中最慢的。+1 - Tyler Rinker
@TylerRinker,如果您有一些基准测试数据,请发布它们,我认为这将非常有趣。 - Paul Hiemstra

5

这不是一个答案,而是对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

再次感谢保罗的分享!

使用rbenchmark在运行R 2.14.1的Win 7机器上进行基准测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接