Skip to content

Script to count unique values from two linked matricies

9 messages · Rui Barradas, PIKAL Petr, Heramb Gadgil +2 more

#
Hi,

Thanks for helping me with this one.

To save you time, the following is the code for the tables I uploaded as jpegs that you may not have received:

dat1<-data.frame(Species=paste("Species",1:3),Site1=c(5,NA,4),Site2=c(3,2,4),Site3=c(NA,5,NA))
dat2<-data.frame(Species=paste("Species",1:3),TraitType1=c(1,2,3),TraitType2=c(2,4,2),TraitType3=c(5,1,1))
dat3<-data.frame(Site=paste("Site",1:3),Trait_Richness=c(5,7,3))

So,

I have two matricies, dat1 and dat2.

Dat1 is a species abundance matrix. Dat2 is a species trait matrix.

I want to create dat3 through use of a script.

Dat 3 is a count of unique traits observed at each site. i.e. at site 1, species 1 and 3 are present (ass seen in dat1). Species 1 has traits: 1, 2 and 5 for trait types 1, 2 and 3 respectively. Species 3 has traits: 3, 2 and 1 for trait types 1, 2 and 3 respectively.

So, at site 1:

For trait type 1, 2 unique traits were observed. For trait type 2, 1 unique trait was observed (both species 1 and 3 were classed as "1") and for trait type 3, 2 unique traits (trait richness) were observed; thus, 2+1+2=5.

and so on... so at site 2, all three species were observed...

For trait type 1, 3 unique traits were observed (1, 2, 3), for trait type 2, 2 unique traits were observed (2, 4, 2) and for trait type 3, 2 unique traits were observed (5, 1, 1). So, for site 2, trait richness is 7 (3+2+2) traits.

I hope this helps to explain, please let me know if you need any further information,

Ben Gillespie
Research Postgraduate

School of Geography
University of Leeds
Leeds
LS2 9JT

Tel: +44(0)113 34 33345
Mob: +44(0)770 868 7641
http://www.geog.leeds.ac.uk/
#
Hello,

Try the following.


countTrait <- function(x) length( unique(x[x != 0]) )

presence <- 1*(!is.na(dat1[-1]))
result <- apply(presence, 2, function(x) apply(dat2[, -1]*x, 2, countTrait))
result <- t(result)
rowSums(result)
#Site1 Site2 Site3
#   5     7     3

Hope this helps,

Rui Barradas
Em 25-09-2012 09:11, Benjamin Gillespie escreveu:
#
Hi

thanks for data. Probably others can come with better solution

with 

library(reshape)

you can put your data to better form

dat2.m<-melt(dat2)
dat1.m<-melt(dat1)

merge them
dat<-merge(dat1.m, dat2.m, by="Species")


and finally compute required values

select one site
temp<-dat[dat[,2]=="Site3"& !is.na(dat[,3]),]

and compute unique values
length(unlist(aggregate(temp$value.y, list(temp$variable.y), unique)$x))

It is not canned solution as I do not have much time to think it over, but if you do not have too much sites you could compute it in simple for cycle.

Regards
Petr
#
Fantastic help - thanks guys.

Heramb, Pikal and Rui all came up with solutions.

I prefer Rui's as it seems the simplest.

I'm going to try and work through them to understand exactly what's going on at each stage.

Thanks again all,

Ben Gillespie
Research Postgraduate

School of Geography
University of Leeds
Leeds
LS2 9JT

Tel: +44(0)113 34 33345
Mob: +44(0)770 868 7641
http://www.geog.leeds.ac.uk/
#
Hi Ben,

Just a modification of Petr's solution with library(data.table):
dat1<-data.frame(Species=paste0("Species",1:3),Site1=c(5,NA,4),Site2=c(3,2,4),Site3=c(NA,5,NA))
?dat2<-data.frame(Species=paste0("Species",1:3),Trait1=1:3,Trait2=c(2,4,2),Trait3=c(5,1,1))
library(data.table)
library(reshape)
datm<-merge(melt(dat1),melt(dat2),by="Species")
temp<-list(data.table(datm[datm[,2]=="Site1" & !is.na(datm[,3]),]),data.table(datm[datm[,2]=="Site2" & !is.na(datm[,3]),]),data.table(datm[datm[,2]=="Site3" & !is.na(datm[,3]),]))
Trait_Richness<-unlist(lapply(temp, function(x) sum(x[,list(length(unique(value.y))),list(variable.y)]$V1)))
?dat3<-data.frame(Site=colnames(dat1)[2:4],Trait_Richness=Trait_Richness)
?dat3
#?? Site Trait_Richness
#1 Site1????????????? 5
#2 Site2????????????? 7
#3 Site3????????????? 3
A.K.



----- Original Message -----
From: Benjamin Gillespie <gybrg at leeds.ac.uk>
To: Heramb Gadgil <heramb.gadgil at gmail.com>
Cc: arun <smartpink111 at yahoo.com>; "r-help at r-project.org" <r-help at r-project.org>
Sent: Tuesday, September 25, 2012 8:56 AM
Subject: RE: [R] Script to count unique values from two linked matricies

Fantastic help - thanks guys.

Heramb, Pikal and Rui all came up with solutions.

I prefer Rui's as it seems the simplest.

I'm going to try and work through them to understand exactly what's going on at each stage.

Thanks again all,

Ben Gillespie
Research Postgraduate

School of Geography
University of Leeds
Leeds
LS2 9JT

Tel: +44(0)113 34 33345
Mob: +44(0)770 868 7641
http://www.geog.leeds.ac.uk/
#
Excellent - thanks so much.

Ben Gillespie
Research Postgraduate

School of Geography
University of Leeds
Leeds
LS2 9JT

Tel: +44(0)113 34 33345
Mob: +44(0)770 868 7641
http://www.geog.leeds.ac.uk/
#
Hi Ben,

No problem.

The code could be collapsed to 2 steps:
library(data.table)
library(reshape)
datm<-merge(melt(dat1),melt(dat2),by="Species")
dat3<-data.frame(unlist(lapply(lapply(split(datm,datm$variable.x),function(x) data.table(x[!is.na(x$value.x),])),function(x) sum(x[,list(length(unique(value.y))),list(variable.y)]$V1))))
?colnames(dat3)<-"Trait_Richness"
dat3
#????? Trait_Richness
#Site1????????????? 5
#Site2????????????? 7
#Site3????????????? 3
A.K.




----- Original Message -----
From: Benjamin Gillespie <gybrg at leeds.ac.uk>
To: arun <smartpink111 at yahoo.com>
Cc: PIKAL Petr <petr.pikal at precheza.cz>; Rui Barradas <ruipbarradas at sapo.pt>; Heramb Gadgil <heramb.gadgil at gmail.com>; R help <r-help at r-project.org>
Sent: Tuesday, September 25, 2012 9:34 AM
Subject: RE: [R] Script to count unique values from two linked matricies

Excellent - thanks so much.

Ben Gillespie
Research Postgraduate

School of Geography
University of Leeds
Leeds
LS2 9JT

Tel: +44(0)113 34 33345
Mob: +44(0)770 868 7641
http://www.geog.leeds.ac.uk/
#
You're good!

Thanks again :)

Ben Gillespie
Research Postgraduate

School of Geography
University of Leeds
Leeds
LS2 9JT

Tel: +44(0)113 34 33345
Mob: +44(0)770 868 7641
http://www.geog.leeds.ac.uk/