2016-09-13 24 views
-2

有時我只是想將索引或標籤提供給map *類型的函數,特別是在最簡單的解決方案是列舉所有可能的組合的問題中。所以,我寫這樣典雅的矩陣行列表?

x = expand.grid(paste0("A", 1:10), paste0("B", 1:10))

Var1 Var2 
1 A1 B1 
2 A2 B1 
3 A3 B1 
4 A4 B1 
5 A5 B1 
6 A6 B1 

表達現在,現在我想每一行轉換到一個列表和一個醜陋的黑客就像

data.frame(t(x))

或者做類似這是煩人的,因爲輸出是嵌套列表,並且需要修復另一個lapply

apply(x, 1, list)然後lapply(.Last.value, unlist)

必須有這樣做的權利的更優雅的方式?

+0

是''接近你想要什麼分裂((x)x,行)? – aichao

回答

1

如果x是一個矩陣標題的問題,我不認爲這是一個壞主意做data.frame(t(x))。另一方面,如果它是由expand.grid產生的數據幀,則可以使用來自data.table包的transpose函數,這優於t(x),因爲t()將數據幀強制轉換爲矩陣,從而改變數據的底層存儲模式並改變回這可能是非常低效的,而transpose是專爲列表,數據幀或數據表移調從?transpose數據幀:

轉置是轉置表,數據幀或數據表的有效方式。

這裏是關於轉置的數據幀的一些基準:

microbenchmark::microbenchmark(data.frame(t(x)), data.table::transpose(x), split(x, 1:nrow(x)), lapply(apply(x, 1, list), unlist), times = 10) 

# Unit: milliseconds 
#        expr  min   lq  mean  median   uq  max neval 
#     data.frame(t(x)) 114.061549 117.662053 121.628102 120.812289 125.132211 135.421358 10 
#   data.table::transpose(x) 1.146525 1.400207 1.469908 1.467571 1.623157 1.736432 10 
#    split(x, 1:nrow(x)) 160.550576 161.626339 187.385706 167.800102 179.647717 355.913319 10 
# lapply(apply(x, 1, list), unlist) 8.183313 8.379791 9.317694 8.783287 9.883049 12.345740 10