Более обобщенная функция expand.grid? - PullRequest
4 голосов
/ 02 февраля 2011

expand.grid (a, b, c) создает все комбинации значений в a, b и c в матрице - по существу, заполняя объем трехмерного куба. То, что я хочу, - это способ получения срезов или линий из этого куба (или более высокой размерной структуры) с центром в кубе.

Итак, учитывая, что 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))

почти, потому что центральная точка повторяется три раза. Кроме того:

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

должен возвращать матрицу, эквивалентную:

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=3)

- это то же самое, что и expand.grid (a, b, c).

Это не так уж плохо с тремя параметрами, но в идеале я хотел бы сделать это с N параметрами, переданными в функцию expand.grid (a, b, c, d, e, f, dimension = 4) - маловероятно, что я когда-либо хотел бы, чтобы размерность больше чем 3 все же.

Это можно сделать, выполнив expand.grid, а затем выделив те точки, которые необходимы, но я не уверен, как построить этот критерий. И у меня всегда есть ощущение, что эта функция существует в какой-то упаковке ...

[Редактировать] Правильно, я думаю, что теперь у меня есть критерий - он связан с тем, сколько раз центральное значение появляется в каждой строке. Если оно меньше или равно вашему измерению + 1 ...

Но генерация полной матрицы быстро растет. Пока подойдет.

1 Ответ

1 голос
/ 02 февраля 2011

Предполагая, что a, b и c имеют длину 3 (и если есть 4 переменные, то каждая имеет длину 4 и т. Д.), Попробуйте это.Он работает, используя 1: 3 вместо каждого из a, b и c, а затем подсчитывает, сколько 3 в каждом ряду.Если есть четыре переменные, то он использует 1: 4 и подсчитывает, сколько 4 в каждой строке и т. Д. Он использует это для индекса, чтобы выбрать соответствующие строки из expand.grid(a, b, c):

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...