2017-10-12 46 views
2

我想矢量化在R中创建一个列表,但只能得到我想要的嵌套for循环。我已经包含了我的问题重现性的大大简化版本。有人可以帮我修改或替换我的mapply功能吗?如何复制一个嵌套for循环与mapply?

所需的功能:

my_list <- list() 
A <- c("one", "two", "three", "four") 
B <- c("left", "right") 
for (a in A) { 
    for (b in B) { 
     my_list <- c(my_list, paste(a, b)) 
    } 
} 
print(my_list) 

输出(为简洁起见编辑空格):

[[1]] [1] "one left" 
[[2]] [1] "one right" 
[[3]] [1] "two left" 
[[4]] [1] "two right" 
[[5]] [1] "three left" 
[[6]] [1] "three right" 
[[7]] [1] "four left" 
[[8]] [1] "four right" 

我试图向量化的:

combinate <- function(a, b) { 
    return(paste(a, b)) 
} 
mapply(combinate, a=A, b=B, SIMPLIFY=FALSE) 

输出:

$one [1] "one left" 
$two [1] "two right" 
$three [1] "three left" 
$four [1] "four right" 

我不关心标签;我很担心从这两个列表中获取所有八个结果。我已经找到了文档,通过将两个列表中的第一个项目配对,然后从两个列表中的第二个项目重复较短的列表,mapply正在完成它应该做的事情。但经过大量搜索之后,我无法找到必须存在的内容,这种方法可以像嵌套for循环一样组合地对所有列表项进行配对。

回答

3

我们可以expand.grid做,paste

v1 <- do.call(paste, expand.grid(A, B)) 

或用outer

v1 <- c(outer(A, B, paste)) 

如果这些需求是在一个list

as.list(v1) 

与OP的输出

identical(as.list(c(t(outer(A, B, paste)))), my_list) 
#[1] TRUE 
+0

我学习困难的方式检查,虽然这些做什么我问过的问题,他们不发挥作用不太一样了-循环。粘贴功能没有被调用8次,每次都有不同的变量,但传递了两个列表或8个项目的数组。外部函数期望粘贴函数(或您提供的任何自定义函数)可以正确处理。或者如果我仍然误解,请纠正我。 :) – mightypile

+0

@mightypile在'outer'中,'FUN'参数是'paste'。 “外层”做的是获得每个向量元素的组合,并通过指定“粘贴”为“FUN”,它正在粘贴 – akrun