Нахождение списка позиций в многомерной структуре (массив) - PullRequest
6 голосов
/ 26 августа 2011

Предположим, у меня есть простая многомерная структура, подобная этой:

somestr<-array(sample.int(2, 120, replace=TRUE), dim=c(4,5,6))

Я ищу все позиции в структуре (в данном случае массив), где значение равно, скажем, для моего примера, 2. Обратите внимание, что структура также может содержать символы или логические символы. На данный момент будет достаточно просто найти все значения, равные заданному, но было бы неплохо распространить идею на любую логически значимую функцию, которая может быть применена к каждому элементу в структуре (это позволит, например, is.na использоваться).

Я хотел бы получить матрицу (integer) с таким количеством столбцов, сколько somestr имеет размеры (в данном случае 3), и столько строк (зависит от вызова sample.int выше), сколько Есть значения, равные данному значению (2). Значения в этой новой матрице являются «координатами» в somestr, где значения равны 2.

Я извиняюсь за то, что смешал мой пример с объяснением, но я надеялся, что так будет яснее. Для справки: я могу сделать это сам (может даже ответить на свой вопрос), но я надеялся на стандартизированное решение (читай: готовая функция в каком-то пакете) или изучал новые приемы.

Итак, вкратце, вы можете написать функцию

posOf<-function(somestr, valueToCompareTo)

, который возвращает матрицу позиций в somestr, равных valueToCompareTo, и, если valueToCompareTo является функцией, позиции в somestr, для которых применение этой функции возвращает TRUE.

1 Ответ

10 голосов
/ 26 августа 2011

Я думаю, что функция which может сделать это:

which(somestr==2, arr.ind=TRUE)

(если я все правильно понял)

R> set.seed(123)
R> somestr <- array(sample.int(2, 120, replace=TRUE), dim=c(4,5,6))
R> somestr
, , 1

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    2    2    1
[2,]    2    1    1    2    1
[3,]    1    2    2    1    1
[4,]    2    2    1    2    2

...

, , 6

     [,1] [,2] [,3] [,4] [,5]
[1,]    2    1    1    1    2
[2,]    1    2    1    2    2
[3,]    1    2    2    2    2
[4,]    2    2    1    1    1

R> which(somestr==2, arr.ind=TRUE)
      dim1 dim2 dim3
 [1,]    2    1    1
 [2,]    4    1    1
 [3,]    1    2    1
 [4,]    3    2    1
 [5,]    4    2    1
...
[57,]    2    5    6
[58,]    3    5    6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...