R同时循环两个或多个向量 - 并行

Posted

技术标签:

【中文标题】R同时循环两个或多个向量 - 并行【英文标题】:R loop over two or more vectors simultaneously - paralell 【发布时间】:2018-04-05 03:53:50 【问题描述】:

我一直在寻找在 R 中同时迭代两个或多个字符向量/列表的方法,例如。有没有办法做类似的事情:

foo <- c('a','c','d')
bar <- c('aa','cc','dd')

for(i in o)
  print(o[i], p[i])

想要的结果:

'a', 'aa'
'c', 'cc'
'd', 'dd'

在 Python 中我们可以做的很简单:

foo = ('a', 'c', 'd')
bar = ('aa', 'cc', 'dd')

for i, j in zip(foo, bar):
    print(i, j)

但是我们可以在 R 中做到这一点吗?

【问题讨论】:

【参考方案1】:

也许有人根据标题到达很好地利用了这一点:

foo<-LETTERS[1:10]
bar<-LETTERS[1:3]
i = 0
for (j in 1:length(foo))
  i = i + 1
  if (i > length(bar))
    i = 1
  
  print(paste(foo[j],bar[i]) )


[1] "A A"
[1] "B B"
[1] "C C"
[1] "D A"
[1] "E B"
[1] "F C"
[1] "G A"
[1] "H B"
[1] "I C"
[1] "J A"

“等价于”:(使用for 简化分配)

suppressWarnings(invisible(
  mapply(function(x, y) 
         print(paste(x, y)),
         foo, bar)
))

【讨论】:

【参考方案2】:

另一种选择是使用mapply。这对打印没有多大意义,但我假设您有兴趣这样做是为了比print

foo <- c('a','c','d')
bar <- c('aa','cc','dd')

invisible(
  mapply(function(f, b) print(c(f, b)),
         foo, bar)
)

【讨论】:

【参考方案3】:

在 R 中,您宁愿根据索引进行迭代,也不愿直接根据向量进行迭代:

for (i in 1:(min(length(foo), length(bar))))
     print(foo[i], bar[i])

【讨论】:

【参考方案4】:

像这样?

foo <- c('a','c','d')
bar <- c('aa','cc','dd')

for (i in 1:length(foo))
  print(c(foo[i],bar[i]))


[1] "a"  "aa"
[1] "c"  "cc"
[1] "d"  "dd"

在向量长度相同的条件下工作。

【讨论】:

以上是关于R同时循环两个或多个向量 - 并行的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用具有并行循环的多个 GhostScript 实例进行打印。

向量的并行求和

R中的并行计算,用于通过循环保存数据

在R中将嵌套的for循环转换为并行

R中的并行化“查找”循环

是否可以在同一存储过程中并行处理for循环?