2012-02-27 70 views
10

我有這樣的嵌套數據幀扁平化數據幀

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

是否有一個簡單的方法來實現這一目標?

回答

13

這條線的伎倆:

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" 
+0

執行太好了,謝謝! – speendo 2012-02-27 15:21:39

+0

你能在我的答案下面打勾嗎?通過這種方式,大家都知道這個問題已經得到解答(我得到了一些代表:)) – 2012-02-27 15:22:56

+0

+ +1顯示了三種不錯的選擇。當然是 – Andrie 2012-02-27 15:24:16

4

這不是一個答案,但跟進/補充保羅的回答是:

始終任何c方法執行最佳的迭代次數。然而,隨着我將迭代次數增加到100000次,從最窮的變爲非常接近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 

100000迭代

 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 

再次感謝分享保羅!

標杆使用Win 7的機器上rbenchmark運行v 2.14.1

+0

感謝您的基準數據! – 2012-02-27 16:09:42