단조 (증가 또는 감소) 순열을 만들기위한 R 함수 [중복]
Nov 26 2020
큰 벡터의 모든 단조 증가 순열을 생성하는 효율적인 함수를 만들려고합니다. 분명히 출력을 expand.grid
줄이거 나 gtools::permutations
작동하지만 더 작은 벡터에만 적용됩니다.
예:
x = 1:3
원하는 출력 :
1, 1, 1
1, 1, 2
1, 1, 3
1, 2, 2
1, 2, 3
1, 3, 3
2, 2, 2
2, 2, 3
2, 3, 3
3, 3, 3
기본 R 또는이 기능이있는 기존 패키지를 사용하는 제안이 있습니까?
편집 : 이상적인 솔루션은 하위 집합에 대한 전체 순열 집합을 생성하지 않는 것입니다.
답변
3 AbdessabourMtk Nov 26 2020 at 04:56
data.table
이것을 사용 하는 것은 매우 쉽습니다.
expand.monotonic <- function(x, len=length(x)){
do.call(CJ, lapply(integer(len), function(...) x ))[
eval(parse(text=paste0("V", 2:len, ">=", "V", 1:(len-1), collapse="&") )), ]
}
expand.monotonic(1:3)
V1 V2 V3
1: 1 1 1
2: 1 1 2
3: 1 1 3
4: 1 2 2
5: 1 2 3
6: 1 3 3
7: 2 2 2
8: 2 2 3
9: 2 3 3
10: 3 3 3
설명:
먼저 복제 된 벡터 len
시간을 포함하는 목록을 만들고 data.table::CJ
모든 벡터를 교차 결합하는 데 사용 합니다. 그리고 이것은 len
기본적 으로 이름이 지정되지 않은 열의 기본 이름 V2>=V1&V3>=V2
과 같이 표현식을 생성하고 해당 표현식 V#
을 평가 한 결과 하위 집합을 기반으로 마법이 발생하는 곳 입니다.
parse(text=paste0("V", 2:len, ">=", "V", 1:(len-1), collapse="&") )
# expression(V2>=V1&V3>=V2)
2 stevec Nov 26 2020 at 05:03
다음은 귀하의 예에서와 같이 반복이 허용되는 순열을 생성하고 각 순열이 단조로운 지 여부를 감지하는 코드입니다.
x <- 1:3
# Generate permutations of length x
out <- gtools::permutations(length(x), length(x), v = x, repeats.allowed=TRUE)
# Detect if they're monotonic
mono <- apply(out, 1, function(x) { all(x == cummax(x)) })
output_with_monotonic_label <- cbind(out, mono)
# output_with_monotonic_label
# mono
# [1,] 1 1 1 1
# [2,] 1 1 2 1
# [3,] 1 1 3 1
# [4,] 1 2 1 0
# [5,] 1 2 2 1
# [6,] 1 2 3 1
# [7,] 1 3 1 0
# [8,] 1 3 2 0
# [9,] 1 3 3 1
# [10,] 2 1 1 0
# ....