2016-07-05 49 views
0

我有一個列表,我試圖從中選擇一個特定的數字。例如:在R中,如何獲得列表中每個元素的組合,然後連接它們?

x <- list() 
x[[1]] <- c(1,2,3) 
x[[2]] <- c(4,5,6) 
x[[3]] <- c(7,8,9) 

現在我這樣做:

Ÿ< - combn(X,2)

Ÿ看起來是這樣的:

 [,1]  [,2]  [,3]  

[1,] Numeric,3 Numeric,3 Numeric,3 

[2,] Numeric,3 Numeric,3 Numeric,3 

矩陣返回表示每個集合的列。但是,我想按照列方式將它們連接起來,但我不能這樣做。

cbind(Y)

 [,1]  [,2]  [,3]  

[1,] Numeric,3 Numeric,3 Numeric,3 

[2,] Numeric,3 Numeric,3 Numeric,3 

應該只有一列,但有兩個!另外,當餘串聯特定元素,發生這種情況:

C(Y [1,1],Y [2,1])

[[1]] 

[1] 1 2 3 

[[2]] 

[1] 4 5 6 

這僅僅是一個例子。實際列表要大得多。我怎樣才能做到這一點?基本上,我試圖做k-fold交叉驗證,但每個數據子集都在列表中。

+2

您的預期成果是什麼? –

+1

「k摺疊交叉驗證」...你看過「庫(插入符號)」嗎? – N8TRO

+0

我想要一個列表,其中包含原始列表中兩個元素中的兩個的每個單一組合。 – Bob

回答

0

按照你的榜樣,因爲你的列表不等長,你可以試試這個:

for(counter in i : ncol(y)){ 
    newList[[counter]] <- do.call(c, y[1 : 2, counter] 
} 
1

從你的問題我想你想要的是使每個列表在矩陣中的列。如果不是這樣,請更正您的問題。

你想使用的是do.call()。我建議查看這個函數的文檔(?do.call) - 但是簡單地說它在列表上執行一個函數。

x <- list() 
x[[1]] <- c(1,2,3) 
x[[2]] <- c(4,5,6) 
x[[3]] <- c(7,8,9) 

do.call(cbind, x) 
    [,1] [,2] [,3] 
[1,] 1 4 7 
[2,] 2 5 8 
[3,] 3 6 9 
+0

它的工作原理,但我真正的列表中的元素的長度是不一樣的?我該怎麼辦? – Bob

+1

在這種情況下 - 您可能不希望將某些東西存儲在矩陣中。你最終的目標是什麼? – SamPassmore

+0

我的最終目標是做k-fold交叉驗證。我想把我的數據的一個子集的每一個組合(但子集不是全部相同的長度)。它是返回矩陣的combn函數。我怎樣才能阻止呢? – Bob

0

你可以只讓指數的矩陣combnapply穿過它,do.call(cbind, ...)荷蘭國際集團每對。你需要一個額外的list()調用,這樣apply並沒有簡化一切都變成一個矩陣:

apply(combn(1:3, 2), 2, function(i){list(do.call(cbind, x[i]))}) 
## [[1]] 
## [[1]][[1]] 
##  [,1] [,2] 
## [1,] 1 4 
## [2,] 2 5 
## [3,] 3 6 
## 
## 
## [[2]] 
## [[2]][[1]] 
##  [,1] [,2] 
## [1,] 1 7 
## [2,] 2 8 
## [3,] 3 9 
## 
## 
## [[3]] 
## [[3]][[1]] 
##  [,1] [,2] 
## [1,] 4 7 
## [2,] 5 8 
## [3,] 6 9 

的元素嵌套煩人,但purrr::flatten()呼叫neatens結構很輕鬆了。

1

我們可以在combn本身內使用它,因爲它有FUN參數。

combn(1:3, 2, FUN = function(i) list(do.call(cbind, x[i]))) 
#[[1]] 
#  [,1] [,2] 
#[1,] 1 4 
#[2,] 2 5 
#[3,] 3 6 

#[[2]] 
#  [,1] [,2] 
#[1,] 1 7 
#[2,] 2 8 
#[3,] 3 9 

#[[3]] 
#  [,1] [,2] 
#[1,] 4 7 
#[2,] 5 8 
#[3,] 6 9 
2

我們可以將列表索引組合起來,並且對於每個組合將兩個對應的列表組件組合成一個向量。

要保留表結構,我們必須通過simplify=Fcombn()

combn(seq_along(x),2L,function(i) c(x[[i[1L]]],x[[i[2L]]]),simplify=F); 
## [[1]] 
## [1] 1 2 3 4 5 6 
## 
## [[2]] 
## [1] 1 2 3 7 8 9 
## 
## [[3]] 
## [1] 4 5 6 7 8 9 
## 

其實有一個更簡單的方法來做到這一點:

combn(x,2L,unlist,simplify=F); 
## [[1]] 
## [1] 1 2 3 4 5 6 
## 
## [[2]] 
## [1] 1 2 3 7 8 9 
## 
## [[3]] 
## [1] 4 5 6 7 8 9 
## 
相關問題