2017-12-02 44 views
1

說我有2個(或以上)的載體:從R中的2個或多個向量創建嵌套列表?

v1 <- letters[1:2] 
v2 <- letters[24:26] 

> v1 
[1] "a" "b" 

> v2 
[1] "x" "y" "z" 

我如何可以以編程方式構建一個嵌套列表這樣的,它包含了所有我的輸入向量的組合的名單?編輯:我想這樣做沒有低效的循環結構。

> l1 <- list(list(v1[1], v2[1]), list(v1[1], v2[2]), 
     list(v1[1], v2[3]), list(v1[2], v2[1]), 
     list(v1[2], v2[2]), list(v1[2], v2[3])) 

> str(l1) 
List of 6 
$ :List of 2 
..$ : chr "a" 
..$ : chr "x" 
$ :List of 2 
..$ : chr "a" 
..$ : chr "y" 
$ :List of 2 
..$ : chr "a" 
..$ : chr "z" 
$ :List of 2 
..$ : chr "b" 
..$ : chr "x" 
$ :List of 2 
..$ : chr "b" 
..$ : chr "y" 
$ :List of 2 
..$ : chr "b" 
..$ : chr "z" 
+0

在列表中是否存在與數據框相反的特定原因? –

+0

是的,我想和do.call一起使用:lapply(my_nested_list,do.call,what = my_function)。 – FB001

+0

你能澄清一下嗎?函數的某些特性是否阻止它與數據框一起使用? –

回答

1

一個簡單的方法是使用循環:

l1 <- list() 
list_pos <- 1L 

for (i in 1:length(v1)) { 
    for (j in 1:length(v2)) { 
    l1[[list_pos]] <- list(v1[i], v2[j]) 
    list_pos <- list_pos + 1L 
    } 
} 

編輯

我認爲循環會有點不公平的代表,但這裏是一些(醜陋的)的代碼,避免他們:

l2 <- apply(expand.grid(v1, v2), 1, as.list) 

Btw。循環速度更快。我懷疑還有一些更漂亮和更有創意的方法來做這件事。

+0

對,我忘了提及我正在尋找避免循環,除了學習如何編寫更好的代碼之外沒有別的原因。 – FB001

+0

謝謝 - 這產生了我正在尋找的結構。我也會重新審視我對循環的假設。不確定,但我認爲循環性能會隨着更長的向量或更多的向量而縮小。 – FB001

+0

我想它確實很差,但應用函數也是隱藏的循環。 – snoram

1

這是一個解決方案,可以將所需的組合生成到數據框中。

> v1 <- letters[1:2] 
> v2 <- letters[24:26] 
> 
> aResult <- expand.grid(v2,v1) 
> View(aResult) 
> aResult 
    Var1 Var2 
1 x a 
2 y a 
3 z a 
4 x b 
5 y b 
6 z b 
> 

如果數據幀必須分成每個列表條目一個組合的list(),我們可以split()做到這一點。

#If the data frame must be split into a list, one entry per row 
aResult$id <- as.factor(1:nrow(aResult)) 
theList <- split(aResult,aResult$id) 

打印列表中的第一個元素,我們看到以下內容。

> theList[[1]] 
    Var1 Var2 id 
1 x a 1 
>