2013-04-22 3 views
40

나는 두 벡터가 : 나는 다음과 같은 벡터 만들려는이 벡터를 기반으로붙여 넣기 두 벡터는

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

: paste으로

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

을 나는이 다음 결과 :

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.griddata.frame를 다시 제공

apply와 함께 사용하면, apply 그것이 matrix로 변환됩니다. 이것은 불필요 할뿐 아니라 대용량 데이터에서는 비효율적입니다. outermatrix을 제공하며 함수 인수도 사용합니다. 거대한 데이터에서도 훨씬 효율적입니다. 질문에서 요청 된 문자열의 순서, 당신은이 두 가지 방법의 두 가지 수정 사용할 수 있습니다 유지하기 위해

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

: 벡터의

변경 순서를 역순

에 결합 outer를 사용

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

expand.grid와 함께 sprintf를 사용하는 또 다른 방법 :

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

나는이 속는 대상으로 사용되고 그러나, 나는 그것이 십자가 기능 CJ() 가입 사용하는 data.table 솔루션을 추가하는 가치 믿습니다 이것이 모든 제안의 가장 우아한 해결책이라고 생각하십시오! –

5

이 오래된 질문에는 이미 대답이 있습니다.경우

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"