[R] matrix help (first occurrence of variable in column)

jim holtman jholtman at gmail.com
Thu May 19 18:49:21 CEST 2011


Is this what you are looking for:

> mdat3
   sp.1 sp.2 sp.3 sp.4 sp.5
T1    1    0    0    1    0
T2    1    0    0    1    0
T3    1    1    1    0    0
T4    1    0    1    1    1
>
> # create a matrix of when species first appeared
> first <- apply(mdat3, 2, function(x) (cumsum(x == 1) > 0) + 0L)
> # use first row as the number of starting species
> start <- sum(first[1,])
> # add column of new species; need diff to see growth
> mdat3 <- cbind(mdat3, new = c(0, diff(rowSums(first) - start)))
>
> mdat3
   sp.1 sp.2 sp.3 sp.4 sp.5 new
T1    1    0    0    1    0   0
T2    1    0    0    1    0   0
T3    1    1    1    0    0   2
T4    1    0    1    1    1   1
>
>



On Thu, May 19, 2011 at 9:46 AM, Michael Denslow
<michael.denslow at gmail.com> wrote:
> On Wed, May 18, 2011 at 9:49 PM, jim holtman <jholtman at gmail.com> wrote:
>> Is this what you were after:
>>
>>> mdat <- matrix(c(1,0,1,1,1,0), nrow = 2, ncol=3, byrow=TRUE,
>> +               dimnames = list(c("T1", "T2"),
>> +                               c("sp.1", "sp.2", "sp.3")))
>>>
>>> mdat
>>   sp.1 sp.2 sp.3
>> T1    1    0    1
>> T2    1    1    0
>>> # do 'rle' on each column and see if it is length >1 and starts with zero
>>> mdat.df <- as.data.frame(mdat)
>>> new.spec <- sapply(mdat.df, function(x){
>> +     x.rle <- rle(x)
>> +     (length(x.rle$values) > 1) & (x.rle$values[1L] == 0)
>> + })
>>> names(mdat.df)[new.spec]
>> [1] "sp.2"
>>>
>
> Thanks for your reply!
> This is close to what I want, but I think it only works if there is
> two rows. My actual data could have up to 8 rows (time samples).
>
> An example with 4 rows:
>
> mdat3 <- matrix(c(1,0,0,1,0,1,0,0,1,0,1,1,1,0,0,1,0,1,1,1), nrow = 4,
> ncol=5, byrow=TRUE,
>               dimnames = list(c("T1", "T2",'T3','T4'),
>                               c("sp.1", "sp.2", "sp.3","sp.4","sp.5")))
>
> mdat3
>
> mdat.df <- as.data.frame(mdat3)
> new.spec <- sapply(mdat.df, function(x){
>    x.rle <- rle(x)
>    (length(x.rle$values) > 1) & (x.rle$values[1L] == 0)
>        })
>
> names(mdat.df)[new.spec]
>
> It should say sp.5 since all the other species have occurred in other
> samples. Any further help would be much appreciated.
>
>
>>
>> On Wed, May 18, 2011 at 9:37 AM, Michael Denslow
>> <michael.denslow at gmail.com> wrote:
>>> Dear R help,
>>> Apologies for the less than informative subject line. I will do my
>>> best to describe my problem.
>>>
>>> Consider the following matrix:
>>>
>>> mdat <- matrix(c(1,0,1,1,1,0), nrow = 2, ncol=3, byrow=TRUE,
>>>               dimnames = list(c("T1", "T2"),
>>>                               c("sp.1", "sp.2", "sp.3")))
>>>
>>> mdat
>>>
>>> In my actual data I have time (rows) and species occurrences (0/1
>>> values, columns). I want to count the number of new species that occur
>>> at a given time sample. For the matrix above the answer would be 1.
>>>
>>> Is there a simple way to figure out if the species has never occurred
>>> before and then sum them up?
>>>
>>> Thanks in advance,
>>> Micheal
>>>
>>> --
>>> Michael Denslow
>>>
>>> I.W. Carpenter Jr. Herbarium [BOON]
>>> Department of Biology
>>> Appalachian State University
>>> Boone, North Carolina U.S.A.
>>> -- AND --
>>> Communications Manager
>>> Southeast Regional Network of Expertise and Collections
>>> sernec.org
>>>
>>> 36.214177, -81.681480 +/- 3103 meters
>>>
>>> ______________________________________________
>>> 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.
>>>
>>
>>
>>
>> --
>> Jim Holtman
>> Data Munger Guru
>>
>> What is the problem that you are trying to solve?
>>
>
>
>
> --
> Michael Denslow
>
> I.W. Carpenter Jr. Herbarium [BOON]
> Department of Biology
> Appalachian State University
> Boone, North Carolina U.S.A.
> -- AND --
> Communications Manager
> Southeast Regional Network of Expertise and Collections
> sernec.org
>
> 36.214177, -81.681480 +/- 3103 meters
>



-- 
Jim Holtman
Data Munger Guru

What is the problem that you are trying to solve?



More information about the R-help mailing list