Bonjour,
Tous d'abord un grand merci a tous les deux pour vos réponses qui me sont très utiles, j'ai bien avancé sur mon problème en revanche j'aimerais aller un peu plus loin dans l'analyse de mes données de manière "automatiques".
En premier lieu, j'ai bien extrait une base de donnée par type de culture avec le code suivant (inspiré de celui de Serge). Le résultat me sort bien 25 bases de données différentes.
Code : Tout sélectionner
#Load data set
data <- as.data.frame(read.csv("~/UCPH/PLEN/Data/R input/Data/TRON_counting_Take_11_3.csv",sep=";",header=TRUE))
#Select column
Take11<-subset(data,select=c(id,intersection,distance,file.distance,depth.cm,grid.m,crop.sys))
#Suppress negative value
Take11<- subset(Take11, as.character(as.numeric(depth.cm))>=0)
#Create one database per crop type
id<-seq(1,40,1)
sous_df<-function(crop.sys,Take11){
assign(paste("Take11",crop.sys,sep="_"),(Take11[Take11$crop.sys==crop.sys,]),envir = .GlobalEnv)
}
lapply(unique(Take11$crop.sys),sous_df,Take11) #applique la fonction sous_df à toutes les valeurs de ID pour le data.frame dta
Ensuite sur chaque base de données, j'aimerais faire tourner le code suivant (cf. ci-dessous inspiré de celui Pierre-Yves), qui me permet de calculer l'indicateur voulu (intersection) par catégorie de profondeur et de l’intégrer dans une nouvelle base de donnée. Enfin, à partir de la dataframe que j’obtiens je fais un calcul d’écart type et de moyenne puis je représente mes données sur un graphique.
Code : Tout sélectionner
#Packages needed
library(dplyr)
library(tidyr)
library(plotrix)
library(forcats)
#Create dataframe with depth class and calculate intersection
tr_width <- 25
t<-Take11 %>%
mutate(depth.cm_tr = -depth.cm %/% tr_width * tr_width) %>% # crée les classes
group_by(crop.sys, id,depth.cm_tr) %>% # groupes pour instuction suivante
summarise(valeur = sum(intersection) / sum(grid.m)) %>% # calcule l'indicateur
spread(id, valeur, sep = "_")
#Remake a dataframe with correct depth classes
t<-as.data.frame(t)
levels <- 15
labels<-c("[350,375[","[325,350[","[300,325[","[275,300[","[250,275[","[225,250[","[200,225[","[175,200[","[150,175[","[125,150[","[100,125[","[75,100[","[50,75[","[25,50[","[0,25[")
group = cut(t$depth.cm_tr,levels,labels=labels, right=FALSE)
t$DClass =(group)
#Change data frame from wide to long format
data_long <- gather(t,id,measurement,id_2:id_17, factor_key=TRUE)
#Calculate the mean and standard error
summary_crop<-as.data.frame(summarise(group_by(data_long,depth.cm_tr,DClass),
mean=mean(measurement,na.rm=TRUE), sd=sd(measurement,na.rm=TRUE)))
arrange(summary_crop, -row_number()) #inverse row order
#Plot the results (Mean and St dev)
par(mar=c(2,5,7,5))
a<-plot(summary_crop$mean,summary_crop$depth.cm_tr,type="b",main="",xaxt="n",xlab="",yaxt="n",ylab="Depth(cm)",xlim=c(-10,100))
axis(3,cex.axis=1.5,labels="Mean root intensity for XX", at=45,line=3,tick=FALSE)
axis(3,cex=0.8)
axis(3,labels="Mean root intensity (intersections/cm of gridline)",at=45,tick=FALSE,line=1.5)
axis(2,las=TRUE)
y=summary_crop$depth.cm_tr
avg=summary_crop$mean
sdev=summary_crop$sd
arrows(avg-sdev,y,avg+sdev,y,length=0.03,angle=90,code=3)
Ma question est la suivante comment puis-je faire pour automatiser la lecture de ce code (2nd code) sur chaque data frame qui "sort" de ma base de donnée initiale (1er code)?
Je tiens à préciser que le nombre de modalités (id) varie d'un culture à une autre, ainsi je dois pour chaque data.frame extraire les id présent au sein de cette dernière afin de pouvoir les référencer dans le code suivant
Code : Tout sélectionner
data_long <- gather(t,id,measurement,id_2:id_17, factor_key=TRUE)
.
Enfin, et si cette boucle fonctionne est-il possible d'automatiser la création d'une fenêtre graphique contenant, au minimum, le nombre de base de données distinctes afin d'avoir une représentation globale de mes données avec chaque cultures représentées dans un graphique/portion unique de ma fenêtre graphique.
Comme vous l'aurez compris je cherche à automatiser la lecture d'une base de donnée qui sera mise à jours de manière récurrente afin d’éviter un laborieux travail d'analyse. Si le sujet s’écarte trop du titre de ce poste je peux le reposter si cela pose problème.
Je vous remercie d'avance pour l'aide que vous pourriez m'apporter, c'est la première que j'envisage d'utiliser R de cette manière (boucle automatique) et suis preneur de tous conseils.
Corentin.