假设我有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 :(得分: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)