用所有vector元素的组合粘贴两个vector
我有两个向量:
vars <- c("SR", "PL") vis <- c(1,2,3)
基于这些vector,我想创build以下vector:
"SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"
paste
我有以下结果:
paste(vars, vis, sep=".") [1] "SR.1" "PL.2" "SR.3"
我如何创build我需要的vector?
你可以使用这个,但可能有一个更简单的解决scheme:
R> apply(expand.grid(vars, vis), 1, paste, collapse=".") [1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3"
expand.grid
返回一个data.frame
,当与apply
一起apply
, apply
会将其转换为一个matrix
。 这只是不必要的(大数据效率低下)。 outer
给出了一个matrix
,也作为函数的参数。 对于庞大的数据也是非常有效的。
使用outer
:
as.vector(outer(vars, vis, paste, sep=".")) # [1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3"
要在问题中维护所请求string的顺序,可以使用这两种方法的这两个修改:
改变向量的顺序并以相反的顺序组合
apply(expand.grid(vis, vars), 1, function(x) paste(x[2], x[1], sep=".")) [1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"
或在转换为向量之前转置matrix:
as.vector(t(outer(vars, vis, paste, sep="."))) [1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"
使用sprintf
与expand.grid
结合使用的另一个选项:
eg <- expand.grid(vis, vars) sprintf('%s.%s', eg[,2], eg[,1])
这使:
[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"
说明:
- 用
expand.grid
创build两个向量的所有组合。 -
sprintf
根据指定的格式('%s.%s'
)sprintf
两个向量粘贴在一起。 格式中的每个%s
部分都由向量的元素replace。
这个老问题已经有了可以接受的答案。 但是,因为它被用作data.table
指针,所以我认为值得添加一个使用交叉连接函数CJ()
的data.table
解决scheme:
library(data.table) CJ(vars, vis)[, paste(V1, V2, sep =".")] #[1] "PL.1" "PL.2" "PL.3" "SR.1" "SR.2" "SR.3"
如果原始订单很重要,
CJ(vars, vis, sorted = FALSE)[, paste(V1, V2, sep =".")] #[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"