Hey,

Looks like I spoke to soon last time. It's almost there but not quite. Now If 
there are more NA's than any other number, it returns NA. That's not the 
correct behavior though as I want to return NA only if all the numbers are NA. 
For example, in the situation below, I want it to return 5 for element [1,1].  
Thanks though for all your help!  

If I take out the "useNA = ifany" then I get a "numeric, 0" if all were NA and 
the correct number if at least some were not NA. Is there a way I can test for 
the "numeric, 0" at the end when the matrix is constructed and swap them out? 
Or is there a simpler way?

Thanks again,
Greg

mymats <- vector('list', 4)
set.seed(246)

# Generate a list of five 3 x 3 matrices
for(i in 1:4) mymats[[i]] <- matrix(sample(1:9), nrow = 3)

mymats[[1]][1,1]<-NA
mymats[[1]][1,2]<-3
mymats[[1]][1,3]<-1
mymats[[2]][2,1]<-2
mymats[[1]][2,2]<-3
mymats[[1]][2,3]<-1
mymats[[1]][3,1]<-2
mymats[[1]][3,2]<-2
mymats[[1]][3,3]<-3

mymats[[2]][1,1]<-NA
mymats[[2]][1,2]<-3
mymats[[2]][1,3]<-2
mymats[[2]][2,1]<-1
mymats[[2]][2,2]<-2
mymats[[2]][2,3]<-2
mymats[[2]][3,1]<-1
mymats[[2]][3,2]<-3
mymats[[2]][3,3]<-2

mymats[[3]][1,1]<-NA
mymats[[3]][1,2]<-2
mymats[[3]][1,3]<-2
mymats[[3]][2,1]<-2
mymats[[3]][2,2]<-3
mymats[[3]][2,3]<-1
mymats[[3]][3,1]<-2
mymats[[3]][3,2]<-2
mymats[[3]][3,3]<-3

mymats[[4]][1,1]<-5
mymats[[4]][1,2]<-1
mymats[[4]][1,3]<-NA
mymats[[4]][2,1]<-3
mymats[[4]][2,2]<-2
mymats[[4]][2,3]<-3
mymats[[4]][3,1]<-1
mymats[[4]][3,2]<-2
mymats[[4]][3,3]<-1

mymats


mode <- function(x){
        as.numeric(names(which.max(table(x,useNA = 'ifany'))))
        }
answer <- apply(array(unlist(mymats), dim = c(dim(mymats[[1]]), 
length(mymats))), 1:2, mode)



On Sep 21, 2010, at 3:27 PM, Henrique Dallazuanna wrote:

> Use this function:
> 
> mode <- function(x, ...)
>     as.numeric(names(which.max(table(x, useNA = 'ifany')))) 
> 
> On Tue, Sep 21, 2010 at 4:18 PM, Gregory Ryslik <rsa...@comcast.net> wrote:
> Hi,
> 
> Much better! That seems to work great. The only time it doesn't work is that 
> if all the elements are NA for a specific element. Then it gives me a 
> numeric(0) for that cell rather than NA.
> 
> On Sep 21, 2010, at 2:30 PM, Henrique Dallazuanna wrote:
> 
>> Try this:
>> 
>>  apply(array(unlist(mymats), dim = c(dim(mymats[[1]]), length(mymats))), 
>> 1:2, mode)
>> 
>> The error was in c(length(mymats), dim(mymats[[1]]))
>> 
>> On Tue, Sep 21, 2010 at 3:19 PM, Gregory Ryslik <rsa...@comcast.net> wrote:
>> Ack,  apologies for the previous email. What I meant to say is that the 
>> first element is calculated incorrectly (1,1) should be 2, instead it is 3. 
>> I've been staring at the code for two long. I've copied it in again for 
>> convenience.
>> 
>> mymats <- vector('list', 4)
>> set.seed(246)
>> 
>> # Generate a list of 4 3 x 3 matrices
>> for(i in 1:4) mymats[[i]] <- matrix(sample(1:9), nrow = 3)
>> 
>> mymats[[1]][1,1]<-3
>> mymats[[1]][1,2]<-3
>> mymats[[1]][1,3]<-1
>> mymats[[2]][2,1]<-2
>> mymats[[1]][2,2]<-3
>> mymats[[1]][2,3]<-1
>> mymats[[1]][3,1]<-2
>> mymats[[1]][3,2]<-2
>> mymats[[1]][3,3]<-3
>> 
>> mymats[[2]][1,1]<-2
>> mymats[[2]][1,2]<-3
>> mymats[[2]][1,3]<-2
>> mymats[[2]][2,1]<-1
>> mymats[[2]][2,2]<-2
>> mymats[[2]][2,3]<-2
>> mymats[[2]][3,1]<-1
>> mymats[[2]][3,2]<-3
>> mymats[[2]][3,3]<-2
>> 
>> mymats[[3]][1,1]<-NA
>> mymats[[3]][1,2]<-2
>> mymats[[3]][1,3]<-2
>> mymats[[3]][2,1]<-2
>> mymats[[3]][2,2]<-3
>> mymats[[3]][2,3]<-1
>> mymats[[3]][3,1]<-2
>> mymats[[3]][3,2]<-2
>> mymats[[3]][3,3]<-3
>> 
>> mymats[[4]][1,1]<-2
>> mymats[[4]][1,2]<-1
>> mymats[[4]][1,3]<-2
>> mymats[[4]][2,1]<-3
>> mymats[[4]][2,2]<-2
>> mymats[[4]][2,3]<-3
>> mymats[[4]][3,1]<-1
>> mymats[[4]][3,2]<-2
>> mymats[[4]][3,3]<-1
>> 
>> mymats
>> 
>> 
>> mode <- function(x){
>>      as.numeric(names(which.max(table(x)))) 
>>      }
>> apply(array(unlist(mymats), dim = c(length(mymats), dim(mymats[[1]]))), 1:2, 
>> mode)
>> 
>> 
>> On Sep 21, 2010, at 10:08 AM, Henrique Dallazuanna wrote:
>> 
>>> Try this:
>>> 
>>> mode <- function(x, ...)
>>>     as.numeric(names(which.max(table(x))))
>>> apply(array(unlist(mymats), dim = c(length(mymats), dim(mymats[[1]]))), 
>>> 1:2, mode)
>>> 
>>> 
>>> On Tue, Sep 21, 2010 at 10:47 AM, Gregory Ryslik <rsa...@comcast.net> wrote:
>>> Hi Everyone,
>>> 
>>> I am interested in taking the mode over several thousand matrices. I show 
>>> an example below. For the [1,1] entry of my "mode" matrix that I want to 
>>> create I would like to have a "2". For the [1,2] entry I would want a 2.  
>>> For the [2,2] entry it would be 4 and so forth. Earlier, I was working with 
>>> continuous cases and thus each (n,m) element was simply an average. I was 
>>> able to then do element-wise addition and counting using the "Reduce" 
>>> function and then the average would be totalsum/totalcount where the NA 
>>> terms were discounted. Here, it's not exactly a binary case so Reduce 
>>> doesn't quite work as well. I'm open to suggestions but would as always 
>>> like to avoid long loops as that will significantly bump up running time 
>>> over several thousand trees. Similarly, I would not like to do a lot of 
>>> sorts to find the mode either...
>>> 
>>> Thanks for your help!
>>> 
>>> mymats
>>> [[1]]
>>>     [,1] [,2] [,3]
>>> [1,]    0    2    1
>>> [2,]    2    3    3
>>> [3,]    2    1    2
>>> 
>>> [[2]]
>>>     [,1] [,2] [,3]
>>> [1,]    1    2    4
>>> [2,]    2    4    4
>>> [3,]    3    4    5
>>> 
>>> [[3]]
>>>     [,1] [,2] [,3]
>>> [1,]    2    3    1
>>> [2,]    3    4    2
>>> [3,]    5    1    3
>>> 
>>> [[4]]
>>>     [,1] [,2] [,3]
>>> [1,]    2    4    2
>>> [2,]    1   NA    2
>>> [3,]    2    3    1
>>> 
>>> [[5]]
>>>     [,1] [,2] [,3]
>>> [1,]   NA    2    1
>>> [2,]    2    4    1
>>> [3,]    1    3    2
>>> ______________________________________________
>>> R-help@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.
>>> 
>>> 
>>> 
>>> -- 
>>> Henrique Dallazuanna
>>> Curitiba-Paraná-Brasil
>>> 25° 25' 40" S 49° 16' 22" O
>> 
>> 
>> 
>> 
>> -- 
>> Henrique Dallazuanna
>> Curitiba-Paraná-Brasil
>> 25° 25' 40" S 49° 16' 22" O
> 
> 
> 
> 
> -- 
> Henrique Dallazuanna
> Curitiba-Paraná-Brasil
> 25° 25' 40" S 49° 16' 22" O


        [[alternative HTML version deleted]]

______________________________________________
R-help@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.

Reply via email to