From f048bf89a8ce88c270781f2c288c6c98ba56e536 Mon Sep 17 00:00:00 2001 From: Georges Kunstler <Georges.Kunstler@gmail.com> Date: Mon, 2 Sep 2013 14:16:17 +1000 Subject: [PATCH] added table with progress in formating each data --- merge.data.PARACOU.R | 36 ++++++++++++++---------------------- ms/data.format.md | 8 +++++--- ms/table.data.progress.ods | Bin 0 -> 13392 bytes 3 files changed, 19 insertions(+), 25 deletions(-) create mode 100644 ms/table.data.progress.ods diff --git a/merge.data.PARACOU.R b/merge.data.PARACOU.R index ea53409..62a38ca 100644 --- a/merge.data.PARACOU.R +++ b/merge.data.PARACOU.R @@ -109,8 +109,8 @@ data.tree <- subset(data.paracou,select=c(vec.basic.var)) #,vec.abio.var.names data.tree[['sp']] <- factor(data.tree[['sp']]) Rlim <- 15 # set size of neighborhood for competition index -system.time(test <- fun.compute.BA.SP.XY.per.plot(1,data.tree=data.tree,Rlim=15,parallel=TRUE,rpuDist=FALSE)) - +## system.time(test <- fun.compute.BA.SP.XY.per.plot(1,data.tree=data.tree,Rlim=Rlim,parallel=TRUE,rpuDist=FALSE)) +library(doParallel) list.BA.SP.data <- mclapply(unique(data.tree[['plot']]),FUN=fun.compute.BA.SP.XY.per.plot,data.tree=data.tree,Rlim=Rlim,mc.cores=4) data.BA.sp <- rbind.fill(list.BA.SP.data) dim(data.BA.SP) @@ -121,6 +121,7 @@ if(sum(!colnames(BA.SP.temp)==as.character((levels(data.tree.s[['sp']]))))>0) st ## test same order as data.tree if(sum(!data.BA.SP[["obs.id"]] == data.tree[["obs.id"]]) >0) stop("competition index not in the same order than data.tree") +################################################ ## REMOVE TREE IN BUFFER ZONE BUFFER ZONE not.in.buffer.zone <- (data.tree[['x']]<(250-Rlim) & data.tree[['x']]>(0+Rlim) & @@ -131,12 +132,6 @@ data.tree[['y']]>(0+Rlim)) data.tree <- subset(data.tree,subset=not.in.buffer.zone) data.BA.sp <- subset(data.BA.sp,subset=not.in.buffer.zone) -## plot each plot -pdf("./figs/plots.tree.pdf") -lapply(unique(data.tree[["plot"]]),FUN=fun.circles.plot,data.tree[['x']],data.tree[['y']],data.tree[["plot"]],data.tree[["D"]],inches=0.2,xlim=c(0,250),ylim=c(0,250)) -dev.off() - - ######################## @@ -146,28 +141,25 @@ dev.off() ### read species names species.clean <- read.csv("./data/raw/DataParacou/20130717_paracou_taxonomie.csv",stringsAsFactors=FALSE, header = T, sep = ";") species.clean$sp <- species.clean[["idTaxon"]] +species.clean$Latin_name <- paste(species.clean[["Genre"]],species.clean[["Espece"]],sep=" ") +## keep only one row pers idTaxon +species.clean <- subset(species.clean,subset=!duplicated(species.clean[["sp"]]),select=c("sp","Latin_name","Genre","Espece","Famille")) -## select species in paracou -species.paracou <- data.frame(sp=species.clean[as.character(species.clean[["sp"]]) %in% as.vector(na.exclude(unique(data.tree[["sp"]]))),c("sp")], - Latin_name=apply((species.clean[as.character(species.clean[["sp"]]) %in% as.vector(na.exclude(unique(data.tree[["sp"]]))) - ,c("Genre","Espece")]),MARGIN=1,FUN=paste,collapse=" ")) - -count.sp.paracou <- data.frame(sp=names(table(data.tree[["sp"]])),n.indiv=as.vector(table(data.tree[["sp"]]))) -species.paracou <- merge(species.paracou,count.sp.paracou,by="sp") - -tapply(species.paracou[["n.indiv"]],INDEX=species.paracou[["Latin_name"]],FUN=sum) - -length(grep("Indet",species.paracou[["Latin_name"]]))/nrow(species.paracou) +## select only species present in data base +species.clean <- subset(species.clean,subset=species.clean[["sp"]] %in% data.tree[["sp"]]) +## percentage of species with no taxonomic identification +length(grep("Indet",species.clean[["Latin_name"]]))/nrow(species.clean) ## 25% ### need to read the different traits data based and merge ..... bridge <- read.csv("./data/raw/DataParacou/BridgeDATA.g.csv",stringsAsFactors=FALSE, header = T, sep = ";") bridge$Latin_name <- paste(bridge[["Genus"]],bridge[["species"]],sep=" ") - dataWD <- read.csv("./data/raw/DataParacou/WD-Species-Paracou-Ervan_GV.csv",stringsAsFactors=FALSE, header = T,sep=" ") seed.traits <- read.csv("./data/raw/DataParacou/Autour de Paracou - Releves par trait et taxon.txt",stringsAsFactors=FALSE, header = T, sep = "\t") -## SPECIES CODE COME FROM idTaxon in paracou_taxonomie and taxonid in paracou_1984_2012 to match the traits data we need to use the "Genus species" -## we better work not work with vernacular because this doesn't match necesseraly the Genus species taxonomie +### +species.clean[["Latin_name"]] %in% bridge[["Latin_name"]] +match( + diff --git a/ms/data.format.md b/ms/data.format.md index f1c4849..8f42907 100644 --- a/ms/data.format.md +++ b/ms/data.format.md @@ -10,7 +10,7 @@ This document describes the data structure and the main R functions available so # Structure of data for analysis -For the analysis we need for each country a list with three elements. +For the analysis we need for each ecoregion country (or big tropical plot) a list with three elements. * First element is a data.frame for individual tree data with columns @@ -38,13 +38,14 @@ For the analysis we need for each country a list with three elements. * Third element is a data.frame for the species traits data with columns - $sp$ the species code as in previous table - - $Latin_name$ the latin name of the species + - $Latin\_name$ the latin name of the species - $Leaf.N.mean$ Leaf Nitrogen per mass in TRY mg/g - $Seed.mass.mean$ dry mass in TRY mg - $SLA.mean$ in TRY mm2 mg-1 - $Wood.density.mean$ in TRY mg/mm3 - $Max.height.mean$ from NFI data I compute the 99% quantile in m - and the same columns with $sd$ instead of $mean$ with either the mean sd within species if species mean or the mean sd with genus if genus mean because no species data + - a dummy variable with true or false if genus mean # Competition index @@ -77,4 +78,5 @@ The objective is to have a table with the species mean of the traits or the genu * Need to write a function to compute mean per species for each traits and decide if we use the same species sd for these data sets. - +# table with data and progress in formating and work TODO +see table.data.progress.ods diff --git a/ms/table.data.progress.ods b/ms/table.data.progress.ods new file mode 100644 index 0000000000000000000000000000000000000000..68bea2a36535ac1b09a0092518bfdb1e7801c0a7 GIT binary patch literal 13392 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 literal 0 HcmV?d00001 -- GitLab