# Re: [R] Extracting the dimnames of an array with variable dimensions

From: <Bill.Venables_at_csiro.au>
Date: Mon, 16 May 2011 16:07:51 +1000

> foo <- array(data = rnorm(32), dim = c(4,4,2),
+ dimnames=list(letters[1:4], LETTERS[1:4], letters[5:6]))
>
> ind <- which(foo > 0, arr.ind = TRUE)
> row.names(ind) <- NULL ## to avoid warnings.
>
> mapply("[", dimnames(foo), data.frame(ind))

[,1] [,2] [,3]

``` [1,] "a"  "A"  "e"
[2,] "b"  "A"  "e"
[3,] "a"  "B"  "e"
[4,] "c"  "B"  "e"
[5,] "a"  "C"  "e"
[6,] "c"  "C"  "e"
[7,] "b"  "D"  "e"
[8,] "a"  "A"  "f"
[9,] "b"  "B"  "f"
[10,] "c"  "B"  "f"
[11,] "d"  "B"  "f"
[12,] "a"  "C"  "f"
[13,] "d"  "C"  "f"
```

[14,] "a" "D" "f"
[15,] "b" "D" "f"

Bill Venables.

Hi:

Does it have to be an array? If all you're interested in is the dimnames, how about this?

library(plyr)
foo <- array(data = rnorm(32), dim = c(4,4,2),

```                   dimnames=list(letters[1:4], LETTERS[1:4], letters[5:6]))
```

> foo

, , e

A B C D

```a -0.2183877 -0.8912908 -2.0175612 -0.8080548
b  0.4870784 -0.8626293 -0.5641368 -0.5219722
c  0.8821044  0.3187850  1.2203297 -0.3151186
d -0.9894656 -1.1779108  0.9853935  0.3560747

```

, , f

A B C D

```a  0.7357773 -1.7591637  1.6320887  1.2248529
b  0.4662315  0.1131432 -0.9790887 -0.6575306
c -0.3564725 -0.9202688  0.1017894  0.7382683
d  0.2825117  0.9242299  0.3577063 -1.3297339

# flatten array into a data frame with dimnames as factors
```
# adply() converts an array to a data frame, applying a function # along the stated dimensions
u <- adply(foo, c(1, 2, 3), as.vector)
subset(u, V1 > 0)[, 1:3]

X1 X2 X3
2 b A e
3 c A e
7 c B e
11 c C e
12 d C e
16 d D e
17 a A f
18 b A f
20 d A f
22 b B f
24 d B f
25 a C f
27 c C f
28 d C f
29 a D f
31 c D f

HTH,
Dennis

On Sun, May 15, 2011 at 9:20 PM, Pierre Roudier <pierre.roudier_at_gmail.com> wrote:
> Hi list,

```>
```

> In a function I am writing, I need to extract the dimension names of
> an array. I know this can be acheived easily using dimnames() but my
> problem is that I want my function to be robust when the number of
> dimensions varies. Consider the following case:
```>
```

> foo <- array(data = rnorm(32), dim = c(4,4,2),
> dimnames=list(letters[1:4], LETTERS[1:4], letters[5:6]))
```>
```

> # What I want is to extract the *names of the dimensions* for which
> foo have positive values:
> ind <- which(foo > 0, arr.ind = TRUE)
```>
```

> # A first solution is:
> t(apply(ind, 1, function(x) unlist(dimnames(foo[x[1], x[2], x[3],
> drop=FALSE]))))
> # But it does require to know the dimensions of foo
```>
```

> I would like to do something like:
```>
```

> ind <- which(foo > 0, arr.ind = TRUE)
> t(apply(ind, 1, function(x) unlist(dimnames(foo[x, drop=FALSE]))))
```>
```

> but in that case the dimnames are dropped.
```>
```

> Any suggestion?
```>
```

> Cheers,
```>
```

> Pierre
```>
```

> --
> Scientist
> Landcare Research, New Zealand
```>

> ______________________________________________
```
> R-help_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> and provide commented, minimal, self-contained, reproducible code.
>

R-help_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.

R-help_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Mon 16 May 2011 - 06:18:35 GMT

This quarter's messages: by month, or sorted: [ by date ] [ by thread ] [ by subject ] [ by author ]

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Mon 16 May 2011 - 08:20:09 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.