从R中的2个或更多向量创建嵌套列表?

时间:2017-12-02 20:10:23

标签: 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"

2 个答案:

答案 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)

顺便说一下。循环更快。我怀疑还有一些更漂亮,更有创意的方法可以做到这一点。

答案 1 :(得分:1)

这是一种在数据框中生成所需组合的解决方案。

<div id='menu'>
  <li><a href="#">Home</a></li>
  <li><a href="#">Our Menu</a></li>
  <li><a href="#">Blog</a></li>
  <li><a href="#">Gallery</a></li>
  <li><a href="#">Store</a></li>
  <li><a href="#">Contact</a></li>
</div>

var href = window.location.href;
var menu = document.getElementById('menu');
if(href == 'SOME THING') 
   menu.children[0].className = 'active';
if(href == 'SOME THING ELSE') 
   menu.children[1].className = 'active'; ///.....

如果必须将数据框拆分为每个列表条目的一个组合> 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)