【问题标题】:Pairwise loop through multiple vectors in R通过R中的多个向量成对循环
【发布时间】:2017-04-30 09:47:35
【问题描述】:

我在 R 中有什么?

以下向量:

N <- c('a','b')
M <- c('x','y')

目标

在保持向量完整的同时(我不希望将它们组合成矩阵),我想以以下成对方式调用向量的元素:

"a" "x" "b" "y"

到目前为止的代码

我尝试过使用for 循环,但是按照下面的写法,它被读取为嵌套的for循环:

for (i in M) for (j in N)  { 
 print(i)
 print(j)
}

结果:

"a" "x" "a" "y" "b" "x" "b" "y"

我搜索过的内容。

使用搜索词作为多重索引for循环双循环,我只能找到关于嵌套循环的信息。使用流命令对我的任务没有帮助。

真正的目标。

我想在图像中添加一行文本。文本标签存储在单个向量中,图像也是如此。到目前为止,我的代码是有效的,除了以上面解释的成对方式调用向量的元素。有很多照片,生命太短了,不能手工完成。

任何帮助将不胜感激!

风格

【问题讨论】:

  • 根据您的解释,您应该查看Map 这从向量(或列表)中获取成对(或更多)参数并将函数应用于它们,并返回一个列表。如果您真的想将图像和文本结合起来然后打印出来(到文件或其他任何地方),那么for 循环将是您最好的选择。

标签: r loops vector double pairwise


【解决方案1】:

我们可以rbind向量然后连接

c(rbind(M, N))
#[1] "x" "a" "y" "b"

或者另一个选项是order,基于vector的顺序

c(M, N)[order(c(seq_along(M), seq_along(N)))]
#[1] "x" "a" "y" "b"

如果我们真的需要一个for 循环,那么预分配一个listlength 等于'M' 中的元素数量,循环遍历其中一个向量的序列,并分配连接的元素'M' 和 'N' 基于 list 元素和 unlist 它的索引

l1 <- vector("list", length(M))
 for(i in seq_along(M)){
   l1[[i]] <- c(M[i], N[i])
 }
unlist(l1)
#[1] "x" "a" "y" "b"

【讨论】:

  • 快速回答!但是使用 for 循环就没有其他选择了吗?原因请参见“真正的目标”段落。
  • @Stijn 我用seq_along 增加了一个选项。我认为for 循环会很慢
  • 我知道 for 循环会很慢,但我不知道如何才能首先加载图像(从向量 1)然后添加文本(从向量 2)。有没有办法以这种方式使用具有多个索引的 for 循环?
  • @akrun,谢谢你的帮助。结合您和@Majed 的回答,我可以使用已有的循环简单地循环使用向量的索引号。
  • 类似于Q,我有一个自定义函数。其中元素1来自N,元素2来自vec M是函数的输入。试过上面的mapply还是不行,请问有dplyr或者lapply的解决方案吗?
【解决方案2】:

在“真实目标”中解释的方式是,“文本标签”向量中的每个元素都对应“图像向量”中的一个。如果这是正确的,那么解决方案不是那么简单(假设两个向量具有相同的长度):

for (i in textTags)
  addThisToThat(textTags[i], images[i])

【讨论】:

    【解决方案3】:

    你知道 lapply 吗?在 purrr 包中,你可以找到它的等价物:map。您还可以在那里找到 map_2,它同时循环两个向量。语法类似于 map_2(vec1, vec2, ~some_function_of(.x, .y))

    【讨论】:

    • @Taz,谢谢你;我知道它可以比循环快得多。将对此进行调查。
    【解决方案4】:

    对于其他有此问题的人,我建议使用基本 R 函数mapply。与for 循环不同,它自动为每个循环定义变量nm

    mapply(N, M, function(n, m) {
       print(n)
       print(m)
    })
    

    注意,如果你想在每个循环上打印一些东西,这不起作用。

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 2021-04-18
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 2015-08-12
      • 2019-05-29
      • 2021-10-21
      • 2016-08-18
      相关资源
      最近更新 更多