From 93ff9809829aef28d1dadbf70c5491cd28e1276f Mon Sep 17 00:00:00 2001 From: Georges Kunstler <Georges.Kunstler@gmail.com> Date: Mon, 2 Sep 2013 15:18:51 +1000 Subject: [PATCH] modified Paracou and Swiss --- R/format.function.R | 29 +++++++++++++++++++++++++++-- merge.data.PARACOU.R | 16 +++++++++++----- merge.data.SWISS.R | 10 +++++++--- ms/table.data.progress.ods | Bin 13392 -> 13580 bytes 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/R/format.function.R b/R/format.function.R index b77dfd2..1f5255e 100644 --- a/R/format.function.R +++ b/R/format.function.R @@ -8,6 +8,19 @@ ###### ###### ## FUNCTION TO PLOT MAP OF TREE +##' .. Function to plot map of tree with circle function of their dbh.. +##' +##' .. content for \details{} .. +##' @title +##' @param plot.select the plot for which draw the map +##' @param x +##' @param y +##' @param plot vectore of plot id for each tree +##' @param D diameter in cm +##' @param inches controling the circle size +##' @param ... +##' @return +##' @author Kunstler fun.circles.plot <- function(plot.select,x,y,plot,D,inches,...){ x.t <- x[plot==plot.select] y.t <- y[plot==plot.select] @@ -108,8 +121,20 @@ print("columns removed") return( (data.merge)) } -#### function with X Y coordinates based on a neighborhood of radius R - +#### +##' .. function compute competition index with X Y coordinates based on a neighborhood of radius R .. +##' +##' .. content for \details{} .. +##' @title +##' @param obs.id id of the observation (if one tree as multiple growth measurement one obs.id per measurment +##' @param xy.table table with x.y of teh individual +##' @param diam diam in cm +##' @param sp species +##' @param Rlim radius of neighborhood search +##' @param parallel run in paralle or not ? +##' @param rpuDist run with GPU distance computation +##' @return a data frame with nrow = length of obs.id and ncol =unique(sp) +##' @author Kunstler BA.SP.FUN.XY <- function(obs.id,xy.table,diam,sp,Rlim,parallel=FALSE,rpuDist=FALSE){ rownames(xy.table) <- obs.id if(rpuDist){ diff --git a/merge.data.PARACOU.R b/merge.data.PARACOU.R index 0451855..f614a4c 100644 --- a/merge.data.PARACOU.R +++ b/merge.data.PARACOU.R @@ -1,12 +1,15 @@ ### MERGE paracou DATA ### Edited by FH -rm(list = ls()); source("./R/format.function.R"); library(reshape) +rm(list = ls()) +source("./R/format.function.R") +library(reshape) ######################### ## READ DATA #################### ### read individuals tree data -data.paracou <- read.table("./data/raw/DataParacou/20130717_paracou_1984_2012.csv",header=TRUE,stringsAsFactors=FALSE,sep = ";", na.strings = "NULL") +data.paracou <- read.table("./data/raw/DataParacou/20130717_paracou_1984_2012.csv", + header=TRUE,stringsAsFactors=FALSE,sep = ";", na.strings = "NULL") #barplot(apply(!is.na(data.paracou[,paste("circ_",1984:2012,sep="")]),MARGIN=2,FUN=sum),las=3) # select good columns @@ -16,9 +19,12 @@ data.paracou <- data.paracou[,c("foret","parcelle","carre","arbre","vernaculaire colnames(data.paracou) <- c("forest","plot","subplot","tree","vernacular","taxonid","x","y","circum2001","code2001","circum2005","code2005","circum2009","code2009","yeardied","typedeath") ### change numeric separator -for(k in 7:14) { - data.paracou[,k] <- gsub(",",".",data.paracou[,k]); data.paracou[,k] <- as.numeric(data.paracou[,k]) } ## Replace all , in decimals with . -data.paracou$treeid <- apply(data.paracou[,1:4],1,paste,collapse="."); ## Create a tree id +numeric.col.name <- c("x","y","circum2001","code2001","circum2005","code2005","circum2009","code2009") +for(k in numeric.col.name){ + data.paracou[,k] <- gsub(",",".",data.paracou[,k]); data.paracou[,k] <- as.numeric(data.paracou[,k]) + } ## Replace all , in decimals with . + +data.paracou$treeid <- apply(data.paracou[,c("plot","subplot","tree")],1,paste,collapse="."); ## Create a tree id data.paracou <- data.paracou[,c(ncol(data.paracou),1:(ncol(data.paracou)-1))] ## ## plot each plot diff --git a/merge.data.SWISS.R b/merge.data.SWISS.R index 5bbef52..96ce7cc 100644 --- a/merge.data.SWISS.R +++ b/merge.data.SWISS.R @@ -11,8 +11,12 @@ data.swiss2 <- read.csv("./data/raw/DataSwiss/LFI23.csv",header=TRUE,stringsAsFa data.swiss3 <- read.csv("./data/raw/DataSwiss/LFI34.csv",header=TRUE,stringsAsFactors =FALSE) data.swiss <- rbind(data.swiss1, data.swiss2, data.swiss3) rm(data.swiss1, data.swiss2, data.swiss3) -data.swiss <- data.swiss[order(data.swiss$BANR),]; data.swiss <- data.swiss[,c(2:19)] -colnames(data.swiss) <- c("Inventid","siteid","treeid","x","y","spcode","sp.name","year","dbh1","dbh2","ba1","ba2","ba_diff","dbh_diff","repfactor1","repfactor2","ht1","ht2") +data.swiss <- data.swiss[order(data.swiss$BANR),] +data.swiss <- data.swiss[,c("INVNR","CLNR","BANR","X","Y","BAUMART","TEXT","VEGPER", + "BHD1","BHD2","BA1","BA2","BAI","BHD_DIFF","RPSTZ1","RPSTZ2","HOEHE1","HOEHE2")] + +colnames(data.swiss) <- c("Inventid","siteid","treeid","x","y","spcode","sp.name","year", + "dbh1","dbh2","ba1","ba2","ba_diff","dbh_diff","repfactor1","repfactor2","ht1","ht2") ## Do not need to read in spp list as it is already available in data.swiss @@ -42,7 +46,7 @@ data.swiss$htot <- data.swiss$ht1 ## height of tree in m ## ECOREGION ################### ## Ecoregion not available for swiss data - +data.swiss$ecocode <- rep("A",nrow(data.swiss)) ###################### ## PERCENT DEAD ################### diff --git a/ms/table.data.progress.ods b/ms/table.data.progress.ods index 68bea2a36535ac1b09a0092518bfdb1e7801c0a7..45ad7a04fb61990b230d2d804cdfdd98e5175b1e 100644 GIT binary patch delta 4091 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 JQw#JM{THZhV;KMd delta 3933 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 -- GitLab