2013-04-22 184 views
40

我有兩個載體:粘貼兩次與所有向量元素的組合向量

vars <- c("SR", "PL") 
vis <- c(1,2,3) 

基於這些矢量我想創建以下矢量:

"SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 

隨着paste我有以下結果:

paste(vars, vis, sep=".") 
[1] "SR.1" "PL.2" "SR.3" 

如何創建我需要的向量?

回答

47

您可以使用此,但有可能是一個簡單的解決方案:

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.frameapply使用時,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" 
6

爲了保持問題請求字符串的順序,你可以用兩種方法這兩個改動:

載體的變化順序,以相反的順序

結合
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" 

或轉換矩陣,然後轉換爲向量:

as.vector(t(outer(vars, vis, paste, sep="."))) 
[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 
4

結合使用sprintfexpand.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創建兩個向量的所有組合。
  • sprintf按照指定的格式('%s.%s')將兩個向量粘貼在一起。格式中的每個%s部分都被向量的元素替換。
+1

我認爲這是所有建議的最優雅的解決方案! – 2017-08-08 15:51:40

5

這個老問題已經有了一個可接受的答案。但是,因爲它是被用來作爲欺騙的目標,我認爲這是值得添加data.table解決方案,它採用了交叉連接功能CJ()

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"