我想知道R中是否有一种通用方法可以从模板创建字符向量,而另一个向量的值可以任意扩展多次。
也就是说,我正在寻找一个tq84(template, vec)
之类的函数,该函数可以用tq84('foo_%d, bar_%d, baz_%d', 1:2)
调用,然后生成向量"foo_1, bar_1, baz_1", "foo_2, bar_2, baz_2"
。请注意,所得向量的长度应等于输入向量的长度。
答案 0 :(得分:2)
也许我们可以使用wwwroot
rep
如果我们需要一个与预期输出完全匹配的字符串
tq84 <- function(template, vec) {
paste(template, rep(vec, each = length(template)), sep="_")
}
v1 <- c("foo", "bar", "baz")
tq84(v1, 1:2)
#[1] "foo_1" "bar_1" "baz_1" "foo_2" "bar_2" "baz_2"
或者另一种选择是使用tq84n <- function(template, vec) {
sapply(as.list(vec), function(x) paste(template, x, sep="_",
collapse=" "))
}
tq84n(v1, 1:2)
#[1] "foo_1 bar_1 baz_1" "foo_2 bar_2 baz_2"
然后执行crossing
group_by
paste
答案 1 :(得分:1)
也许,我们可以将outer
与paste
一起使用
vec <- c("foo", "bar", "vec")
c(outer(vec, 1:2, paste, sep = "_"))
#[1] "foo_1" "bar_1" "vec_1" "foo_2" "bar_2" "vec_2"
或者,如果您想将它们分开,则可以跳过c
outer(vec, 1:2, paste, sep = "_")
# [,1] [,2]
#[1,] "foo_1" "foo_2"
#[2,] "bar_1" "bar_2"
#[3,] "vec_1" "vec_2"
或者与期望的输出完全匹配
apply(outer(vec, 1:2, paste, sep = "_"), 2, paste, collapse = ", ")
#[1] "foo_1, bar_1, vec_1" "foo_2, bar_2, vec_2"
答案 2 :(得分:1)
返回列表的Map
替代项:
tq84 <- function(vec, numbers){
Map(function(x)
paste0(vec[x],"_",numbers),
seq_along(vec))
}
foobar <- c("foo","bar","baz")
tq84(foobar,1:2)
[[1]]
[1] "foo_1" "foo_2"
[[2]]
[1] "bar_1" "bar_2"
[[3]]
[1] "baz_1" "baz_2"