不使用循环将多个不同长度的列表粘合在一起(使用paste0)。

4

我正在将一些变量粘贴到一个确定的URL列表中

id <- 1:10
animal <- c("dog", "cat", "fish")
base <- "www.google.com/"

urls <- paste0(base, "id=", id, "search=", animal)

输出结果如下:
 [1] "www.google.com/id=1search=dog"  "www.google.com/id=2search=cat"  "www.google.com/id=3search=fish"
 [4] "www.google.com/id=4search=dog"  "www.google.com/id=5search=cat"  "www.google.com/id=6search=fish"
 [7] "www.google.com/id=7search=dog"  "www.google.com/id=8search=cat"  "www.google.com/id=9search=fish"
[10] "www.google.com/id=10search=dog"

但是我实际上希望idsanimals按照顺序重复,就像这样:
 [1] "www.google.com/id=1search=dog"  "www.google.com/id=2search=dog"  "www.google.com/id=3search=dog"
 [4] "www.google.com/id=4search=dog"  "www.google.com/id=5search=dog"  "www.google.com/id=6search=dog"
 [7] "www.google.com/id=7search=dog"  "www.google.com/id=8search=dog"  "www.google.com/id=9search=dog"
[10] "www.google.com/id=10search=dog" "www.google.com/id=1search=cat"   ...
1个回答

6
您可以通过在paste0sprintf中包含rep来修改代码。
 sprintf('%sid=%dsearch=%s', base, id, rep(animal,each=length(id)))

或者

 paste0(base, 'id=',id, 'search=', rep(animal,each=length(id)))

或者像@MrFlick建议的那样,我们可以使用expand.grid获取“animal”和“id”之间的所有组合。
  with(expand.grid(a=animal, i=id), paste0(base, "id=", i, "search=", a))

2
这是向量循环利用的好例子。您还可以通过 expand.grid 更明确地表达:with(expand.grid(a=animal, i=id), paste0(base, "id=", i, "search=", a)) - MrFlick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接