My error. Clearly I did not do enough testing.

z <- array(1:24,dim=2:4)
> all.equal(f(z,1),f2(z,1))
[1] TRUE
> all.equal(f(z,2),f2(z,2))
[1] TRUE
> all.equal(f(z,3),f2(z,3))
[1] "Attributes: < Component “dim”: Mean relative difference: 0.4444444 >"
[2] "Mean relative difference: 0.6109091"    

# Your earlier example
> z <- array(1:120, dim=2:5)
> all.equal(f(z,1),f2(z,1))
[1] TRUE
> all.equal(f(z,2),f2(z,2))
[1] TRUE
> all.equal(f(z,3),f2(z,3))
[1] "Attributes: < Component “dim”: Mean relative difference: 0.4444444 >"
[2] "Mean relative difference: 0.1262209"                                 
> all.equal(f(z,4),f2(z,4))
[1] "Attributes: < Component “dim”: Mean relative difference: 0.5714286 >"
[2] "Mean relative difference: 0.5855162"  

David C

-----Original Message-----
From: Bert Gunter [mailto:bgunter.4...@gmail.com] 
Sent: Thursday, June 1, 2017 2:00 PM
To: David L Carlson <dcarl...@tamu.edu>
Cc: Roy Mendelssohn - NOAA Federal <roy.mendelss...@noaa.gov>; R-help 
<r-help@r-project.org>
Subject: Re: [R] Reversing one dimension of an array, in a generalized case

??

> z <- array(1:24,dim=2:4)
> all.equal(f(z,3),f2(z,3))

[1] "Attributes: < Component “dim”: Mean relative difference: 0.4444444 >"
[2] "Mean relative difference: 0.6109091"

In fact,

> dim(f(z,3))
[1] 2 3 4

> dim(f2(z,3))
[1] 3 4 2

Have I made some sort of stupid error here? Or have I misunderstood
what was wanted?

Cheers,
Bert




Bert Gunter

"The trouble with having an open mind is that people keep coming along
and sticking things into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )


On Thu, Jun 1, 2017 at 11:34 AM, David L Carlson <dcarl...@tamu.edu> wrote:
> Here is an alternative approach using apply(). Note that with apply() you are 
> reversing rows or columns not indices of rows or columns so apply(junk, 2, 
> rev) reverses the values in each column not the column indices. We actually 
> need to use rev() on everything but the index we are interested in reversing:
>
> f2 <- function(a, wh) {
>     dims <- seq_len(length(dim(a)))
>     dims <- setdiff(dims, wh)
>     apply(apply(a, dims, rev), dims, t)
> }
>
> # Your example
> j1 <- junk[ , rev(1:10), ]
> j2 <- f2(junk, 2)
> all.equal(j1, j2)
> # [1] TRUE
>
> # Bert's example
> z1 <- f(z, 2)
> z2 <- f2(z, 2)
> all.equal(z1, z2)
> # [1] TRUE
>
> -------------------------------------
> David L Carlson
> Department of Anthropology
> Texas A&M University
> College Station, TX 77840-4352
>
>
>
>
>
>
> -----Original Message-----
> From: R-help [mailto:r-help-boun...@r-project.org] On Behalf Of Bert Gunter
> Sent: Thursday, June 1, 2017 12:46 PM
> To: Roy Mendelssohn - NOAA Federal <roy.mendelss...@noaa.gov>
> Cc: R-help <r-help@r-project.org>
> Subject: Re: [R] Reversing one dimension of an array, in a generalized case
>
> How about this:
>
> f <- function(a,wh){ ## a is the array; wh is the index to be reversed
>    l<- lapply(dim(a),seq_len)
>    l[[wh]]<- rev(l[[wh]])
>    do.call(`[`,c(list(a),l))
> }
>
> ## test
> z <- array(1:120,dim=2:5)
>
> ##  I omit the printouts
>
> f(z,2)
>
> f(z,3)
>
>
> Cheers,
> Bert
>
> Bert Gunter
>
> "The trouble with having an open mind is that people keep coming along
> and sticking things into it."
> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )
>
>
> On Thu, Jun 1, 2017 at 9:51 AM, Roy Mendelssohn - NOAA Federal
> <roy.mendelss...@noaa.gov> wrote:
>> Hi All:
>>
>> I have been looking for an elegant way to do the following,  but haven't 
>> found it,  I have never had a good understanding of any of the "apply" 
>> functions.
>>
>> A simplified idea is I have an array, say:
>>
>> junk(5, 10, 3)
>>
>> where  (5, 10, 3) give the dimension sizes, and I want to reverse the second 
>> dimension, so I could do:
>>
>> junk1 <- junk[, rev(seq_len(10), ]
>>
>> but what I am after is a general function that will do that where the array 
>> could be two, three or four dimensions,  and I pass to the function which 
>> dimension I want to reverse, that is the function can not assume the number 
>> of dimensions of the array nor which dimension to reverse.
>>
>> For example,  if i try:
>>
>> junk1 <- apply(junk, 2, rev)
>>
>> junk1 comes out as two-dimensional,  not three-dimensional.
>>
>> It is probably something obvious but I am not getting it.
>>
>> Thanks for any help.
>>
>> -Roy
>>
>>
>> **********************
>> "The contents of this message do not reflect any position of the U.S. 
>> Government or NOAA."
>> **********************
>> Roy Mendelssohn
>> Supervisory Operations Research Analyst
>> NOAA/NMFS
>> Environmental Research Division
>> Southwest Fisheries Science Center
>> ***Note new street address***
>> 110 McAllister Way
>> Santa Cruz, CA 95060
>> Phone: (831)-420-3666
>> Fax: (831) 420-3980
>> e-mail: roy.mendelss...@noaa.gov www: http://www.pfeg.noaa.gov/
>>
>> "Old age and treachery will overcome youth and skill."
>> "From those who have been given much, much will be expected"
>> "the arc of the moral universe is long, but it bends toward justice" -MLK Jr.
>>
>> ______________________________________________
>> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> 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@r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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.

Reply via email to