Je cherche à automatiser l'analyse d'une base de données. Pour cela je divise ma "méta base de donnée" en différentes bases de données par catégories de cultures et ensuite je groupe les noms de mes différentes bases de données dans une liste. Je fais cela avec le code suivant:
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))
#Create one database per crop type
id<-seq(1,40,1)
sous_df<-function(crop.sys,Take11){
assign(paste("Crop_11",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
# put the data.frames into a named list, where names correspond to data.frame names
myList <- mget(ls(pattern="^Crop_11"))
# fill in the column values
myList <- lapply(myList,function(i) within(i, rowNum <- seq_len(nrow(i))))
Ensuite sur chaque base de données j'aimerais calculer un indicateur en fonction des valeurs présentes dans la base de données (ligne: intersection/grid) et les regrouper en tranches de profondeur, pour cela j'essaye de faire tourner la boucle suivante mais R me renvoie "Error: Condition message must be a string"
Le code que j'utilise est le suivant:
Code : Tout sélectionner
tr_width <- 25
lapply(myList, function(df)
{
t[i]<-df[i] %>%
mutate(depth.cm_tr = -df$depth.cm %/% tr_width * tr_width) %>% # crée les classes
group_by(df$crop.sys,df$id,depth.cm_tr) %>% # groupes pour instuction suivante
summarise(valeur = sum(df$intersection) / sum(df$grid.m)) %>% # calcule l'indicateur
spread(df$id,valeur, sep = "_")
NULL
})
Est-ce quelqu'un aurais une idée du problème qu'il y a dans ma/mes lignes de code?
Aussi, une fois cela réalisé, j'aimerais faire tourner une autre boucle qui me permettrait de transformer mes bases de données t[i] du format "wide" au format "long" avec le code suivant:
Code : Tout sélectionner
myList2 <- mget(ls(pattern="^t"))
myList2 <- lapply(myList2,function(i) within(i, rowNum <- seq_len(nrow(i))))
lapply(myList2, function(df)
{
data_long[i] <- gather(t[i],id,measurement,id_2:id_17, factor_key=TRUE)
NULL
})
Le problème est que le nom et nombre de colonnes (i.e.id_2:id_17 dans l'exemple ci-dessus) changes d'une base de données à l’autre (ex: id_24:id_56 dans le cas d'une autre base de données). Comment puis-je extraire le nom et nombre de colonnes de chaque bases de données afin de les référencer ensuite dans ma ligne de code?
Par avance, je vous remercie pour votre aide.
Corentin.
ps: Ps: J'ai recrée un post car le sujet me semblait un peu éloigné de ma question précédente