繁体   English   中英

替代 R 中的嵌套 for 循环,没有所有可能的组合

[英]Alternative to nested for loop in R without all possible combinations

想象一下我有这个嵌套的 for 循环,它打印出 a 和 b 的所有组合

a = c(1,2,3,4)
b = c(2,3,4,5)

for(i in a){
  for(k in b){
    print(i + k)
  }}

所以 output 看起来像这样

[1] 3
[1] 4
[1] 5
[1] 6
[1] 4
[1] 5
[1] 6
[1] 7
[1] 5
[1] 6
[1] 7
[1] 8
[1] 6
[1] 7
[1] 8
[1] 9

如何遍历这两个循环以获得只有 4 个项目的结果,即 a 和 b 中具有相同索引的元素之和,类似于遍历 Python 中的字典? 我想要这样的结果:

[1] 3
[1] 5
[1] 7
[1] 9

或这个

[1] 3 5 7 9 

因此,我只是将 a 和 b 相加,就像将 dataframe 中的两列相加以产生相同长度的三分之一。

我感谢任何帮助。

尝试映射

mapply(`+`, a, b)
# [1] 3 5 7 9

我们可以替换+任何其他 function,例如paste*

mapply(paste, a, b)
# [1] "1 2" "2 3" "3 4" "4 5"
mapply(`*`, a, b)
# [1]  2  6 12 20

R中,循环被包装到 *apply 函数中,参见:

正如评论中指出的那样,在R中, +等数学运算符是Vectorize d。 这意味着默认情况下,您可以将向量作为 arguments 提供给它们,它们将知道如何遍历每个输入向量中的元素。 因此,只需执行a + b即可获得所需的结果。 如果你真的想把它作为一个循环来做,那么你就不需要嵌套它——只需使用一个索引i来从两个输入向量中提取元素。 另一个可能在这里有用的选项是purrr::map2() ,它将指定的 function 应用于两个输入列表。

但是值得注意的是,如果您确实想查看所有成对组合,则可以使用outer() function。

# test vectors
a = c(1,2,3,4)
b = c(2,3,4,5)

# operate pairwise through the two vectors
a + b
#> [1] 3 5 7 9

# go through vectors as a loop
for(i in seq_along(a)){
      print(a[i] + b[i])
}
#> [1] 3
#> [1] 5
#> [1] 7
#> [1] 9

# for more complex function can use purrr::map2 to run on two input lists
purrr::map2_dbl(.x = a, .y = b, `+`)
#> [1] 3 5 7 9

# operate on all combinations
outer(a, b, `+`)
#>      [,1] [,2] [,3] [,4]
#> [1,]    3    4    5    6
#> [2,]    4    5    6    7
#> [3,]    5    6    7    8
#> [4,]    6    7    8    9

reprex package (v2.0.1) 创建于 2022-04-13

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM