我有兩個載體:粘貼兩次與所有向量元素的組合向量
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"
如何創建我需要的向量?
我有兩個載體:粘貼兩次與所有向量元素的組合向量
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"
如何創建我需要的向量?
您可以使用此,但有可能是一個簡單的解決方案:
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
將其轉換爲matrix
。這只是不必要的(對大數據而言效率低)。 outer
給出了一個matrix
並且還採用了函數參數。這對於大量數據也是非常有效的。
使用outer
:
as.vector(outer(vars, vis, paste, sep="."))
# [1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3"
爲了保持問題請求字符串的順序,你可以用兩種方法這兩個改動:
載體的變化順序,以相反的順序
結合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"
結合使用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
創建兩個向量的所有組合。sprintf
按照指定的格式('%s.%s'
)將兩個向量粘貼在一起。格式中的每個%s
部分都被向量的元素替換。這個老問題已經有了一個可接受的答案。但是,因爲它是被用來作爲欺騙的目標,我認爲這是值得添加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"
我認爲這是所有建議的最優雅的解決方案! – 2017-08-08 15:51:40