모든 벡터 요소의 조합으로 두 벡터 붙여 넣기
두 개의 벡터가 있습니다.
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
A를 변환됩니다 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.
'Nice programing' 카테고리의 다른 글
엔터프라이즈 배포 인증서 만료를 관리하는 방법은 무엇입니까? (0) | 2020.12.04 |
---|---|
마스크 / 자르기없이 SVG를 컨테이너로 확장 (0) | 2020.12.04 |
폴터 가이스트 / PhantomJS와 카피 바라 웹킷은 어떻게 다릅니 까? (0) | 2020.12.04 |
Young, Tenured 및 Perm 세대 (0) | 2020.12.04 |
JSP 페이지 세션 = "false"지시문을 설정하는 이유는 무엇입니까? (0) | 2020.12.04 |