Nice programing

모든 벡터 요소의 조합으로 두 벡터 붙여 넣기

nicepro 2020. 12. 4. 20:34
반응형

모든 벡터 요소의 조합으로 두 벡터 붙여 넣기


두 개의 벡터가 있습니다.

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, applyA를 변환됩니다 matrix. 이것은 불필요합니다 (대용량 데이터에서는 비효율적입니다). outer를 제공하고 matrix함수 인수도받습니다. 대용량 데이터에서도 훨씬 효율적입니다.

사용 outer:

as.vector(outer(vars, vis, paste, sep="."))
# [1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "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형식의 부분은 벡터의 요소로 대체됩니다.

질문에서 요청 된 문자열의 순서를 유지하려면 두 방법에 대해 다음 두 가지 수정을 사용할 수 있습니다.

벡터 순서를 변경하고 역순으로 결합

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"

또 다른 옵션은 다음 each인수 를 사용하는 것 입니다 rep.

paste(rep(vars, each = length(vis)), vis, sep = ".")

나는 기반으로 솔루션에 비해이 더 간단 찾을 수 apply또는 expand.grid.


이 오래된 질문에는 이미 허용 된 답변이 있습니다. 그러나 복제 대상 data.table으로 사용되므로 교차 조인 기능 을 사용 하는 솔루션 을 추가하는 것이 가치가 있다고 생각합니다 CJ().

library(data.table) 
options(datatable.CJ.names=FALSE) # required with version version 1.12.0+
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"

편집 : CJ()버전 1.12.0에서 기본 동작이 변경되었습니다 .

버전 1.12.0 (Point 3) 릴리스 노트에 발표 된대로 기본 옵션 options(datatable.CJ.names=TRUE)이 변경되었습니다. CJ()이제 입력의 이름이 정확히 자동으로 지정 as data.table()됩니다.

따라서 위의 코드는 data.table버전 1.12.0 이상에서 수정되어야합니다 .

library(data.table)   ### version 1.12.0+
CJ(vars, vis)[, paste(vars, vis, sep =".")]

CJ(vars, vis, sorted = FALSE)[, paste(vars, vis, sep =".")]

resp.

참고 URL : https://stackoverflow.com/questions/16143700/pasting-two-vectors-with-combinations-of-all-vectors-elements

반응형