【问题标题】:Finding list of positions in multidimensional structure (array)查找多维结构(数组)中的位置列表
【发布时间】:2011-11-04 11:08:09
【问题描述】:

假设我有一个简单的多维结构,像这样:

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

我正在查找结构(在本例中为数组)中值等于 2 的所有位置,例如我的示例。请注意,该结构也可以保存字符或逻辑。目前,它只找到等于给定值的所有值,但最好将这个想法扩展到任何可以应用于结构中每个项目的逻辑值函数(这将允许例如is.nato使用)。

我想要得到的是一个 (integer) 矩阵,其列数与 somestr 的维度(在本例中为 3)和行数(取决于上面的 sample.int 调用)一样多存在等于给定值 (2) 的值。这个新矩阵中的值是somestr 中的“坐标”,其中的值等于 2。

对于将我的示例与解释混为一谈,我深表歉意,但我希望这样会更清楚。郑重声明:我可以自己制作(甚至可以回答我自己的问题),但我希望有一个标准化的解决方案(阅读:某个包中的现成函数),或者在此过程中学习新技巧。

那么,简而言之,你能不能写一个函数

posOf<-function(somestr, valueToCompareTo)

返回somestr 中等于valueToCompareTo 的位置矩阵,如果valueToCompareTo 是一个函数,则应用此函数的somestr 中的位置返回TRUE

【问题讨论】:

  • somestr 有 3 个维度;这与“我想要得到的是一个(整数)矩阵,其列数与 somestr 的列数以及与给定值 (2) 相等的值的行数一样多。这个新的值矩阵是 somestr 内的坐标值等于 2。"???
  • @Gavin:我不明白它是怎么做到的。尽管如此,我还是做了一些编辑,希望能澄清一下。
  • somestr 没有三列,数组的每个切片都有五列,至少来自您的示例(dim = c(4,5,6))!您是指三个维度吗?这就是让我感到困惑的地方。我最初的猜测是直接使用which(...., arr.ind = TRUE)arrayInd(..., .dim = 1:3),但这似乎与描述不符。
  • 已编辑。抱歉,星期五一定很糟糕。

标签: r multidimensional-array position


【解决方案1】:

我认为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

【讨论】:

  • 哇!这很漂亮,我从没想过为此使用 which,尽管事后看来它是完全合理的。我怀疑有人会对此有所改进,但我现在会屏住呼吸。
猜你喜欢
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 2010-10-14
相关资源
最近更新 更多