在没有所有可能组合的情况下替代 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)
}}
所以输出看起来像这样
[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 相加,就像将数据框中的两列相加以产生相同长度的三分之一。
感谢任何帮助。
正如评论中指出的那样,在R
中,+
等数学运算符是Vectorize
d。这意味着默认情况下,您可以将向量作为参数提供给它们,它们将知道如何遍历每个输入向量中的元素。因此,只需执行 a + b
即可获得所需的结果。如果你真的想把它作为一个循环来做,那么你就不需要嵌套它——只需要一个索引,i
,从两个输入向量中提取元素。另一个可能有用的选项是 purrr::map2()
,它将指定的函数应用于两个输入列表。
但是值得注意的是,如果您确实想要查看所有成对组合,您可以使用outer()
函数。
# 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 创建
尝试映射:
mapply(`+`, a, b)
# [1] 3 5 7 9
我们可以替换+
任何其他函数,例如paste
或*
:
mapply(paste, a, b)
# [1] "1 2" "2 3" "3 4" "4 5"
mapply(`*`, a, b)
# [1] 2 6 12 20
在 R 中,循环被包装到 *apply 函数中,参见:
- Grouping functions (tapply, by, aggregate) and the *apply family
假设我有这个嵌套的 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)
}}
所以输出看起来像这样
[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 相加,就像将数据框中的两列相加以产生相同长度的三分之一。
感谢任何帮助。
正如评论中指出的那样,在R
中,+
等数学运算符是Vectorize
d。这意味着默认情况下,您可以将向量作为参数提供给它们,它们将知道如何遍历每个输入向量中的元素。因此,只需执行 a + b
即可获得所需的结果。如果你真的想把它作为一个循环来做,那么你就不需要嵌套它——只需要一个索引,i
,从两个输入向量中提取元素。另一个可能有用的选项是 purrr::map2()
,它将指定的函数应用于两个输入列表。
但是值得注意的是,如果您确实想要查看所有成对组合,您可以使用outer()
函数。
# 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 创建尝试映射:
mapply(`+`, a, b)
# [1] 3 5 7 9
我们可以替换+
任何其他函数,例如paste
或*
:
mapply(paste, a, b)
# [1] "1 2" "2 3" "3 4" "4 5"
mapply(`*`, a, b)
# [1] 2 6 12 20
在 R 中,循环被包装到 *apply 函数中,参见:
- Grouping functions (tapply, by, aggregate) and the *apply family