2011-02-02 3 views
4

expand.grid (a, b, c)는 본질적으로 입체 큐브의 볼륨을 채우는 매트릭스의 a, b 및 c 값의 모든 조합을 생성합니다. 내가 원하는 것은 입방체를 중심으로 그 입방체 (또는 더 높은 차원의 구조체)에서 조각이나 선을 얻는 방법입니다.더 일반화 된 expand.grid 함수?

그래서, A, B, C 모두 홀수 길이 벡터는 (그래서 그들은 중심을 가지고),이 경우 것이의 그들이 길이 5. 내 가상 slice.grid 기능입니다 가정 해 봅시다 주어진 :

slice.grid(a,b,c,dimension=1) 

은 세 개의 중심선을 따라 점 좌표의 행렬을 반환합니다. 대략 중심점이 세 번 반복되었으므로

rbind(expand.grid(a[3],b,c[3]), 
     expand.grid(a,b[3],c[3]), 
     expand.grid(a[3],b[3],c)) 

과 거의 같습니다. 또한, (교차점에 매트릭스 반복 점) 세 교차 축 - 정렬 평면이다

rbind(expand.grid(a,b,c[3]), expand.grid(a,b[3],c), expand.grid(a[3],b,c)) 

:

slice.grid(a,b,c,dimension=2) 

는 매트릭스에 상당하는 복귀한다.

: 그리고

slice.grid(a,b,c,dimension=3) 

expand.grid은 동일하다 (A, B, C).

이것은 세 가지 매개 변수로 그렇게 나쁘지는 않지만 이상적으로 expand.grid (a, b, c, d, e, f, dimension = 4) 함수에 전달 된 N 매개 변수를 사용하여이 작업을 수행하고 싶습니다. - 그 가능성은 3보다 큰 차원을 원할 것입니다.

expand.grid를 수행하고 필요한 지점을 추출하여 수행 할 수 있지만 그 기준을 작성하는 방법을 잘 모르겠습니다. 그리고 나는이 기능이 어떤 패키지에 어딘가에 자리 잡고 있다는 느낌을 항상 가지고 있습니다 ...

[편집] 맞습니다. 나는 이제 기준을 알아 냈다고 생각합니다 - 중심 값이 각 열. 크기가 +1보다 작거나 같으면 ...

하지만 전체 행렬을 빠르게 생성하는 것은 큰 도움이됩니다. 이제 할거야.

답변

1

a, bc은 길이가 각각 3입니다 (4 개의 변수가 있으면 길이가 4 인 등). a, bc 대신 1 : 3을 사용하고 각 행에 얼마나 많은 3이 있는지 계산합니다. 의 그것은 expand.grid(a, b, c)에서 해당 행을 선택하는 색인이를 사용하는 등, 각 행에 얼마나 많은 4 4 카운트 : 네 개의 변수가있는 경우 다음 1을 사용

slice.expand <- function(..., dimension = 1) { 
    L <- lapply(list(...), seq_along) 
     n <- length(L) 
    ix <- rowSums(do.call(expand.grid, L) == n) >= (n-dimension) 
    expand.grid(...)[ix, ] 
} 

# test 
a <- b <- c <- LETTERS[1:3] 
slice.expand(a, b, c, dimension = 1) 
slice.expand(a, b, c, dimension = 2) 
slice.expand(a, b, c, dimension = 3) 
+0

네를, 나는 했어 이런 식으로,하지만 중간 지점에 더 관심이있어 시퀀스의 중간 값에 대해 테스트했습니다. expand.grid의 두 가지를 많이 버리지 않고 그것을 수행하는 것이 좋을 것입니다. :) Tick for you. – Spacedman

관련 문제