Mon but est d'appliquer la fonction décrite ci dessous à l'ensemble des données (réelle, comprise entre 0 et 20) d'un data frame dimension 100000*15.
Code : Tout sélectionner
hab_p_bba1 <- function(x){
xi_p = c(0,0.1,0.3,0.6,1.2,20) #abscisses des différentes profondeur (penser à ajouter l'abscisse 0)
yi_p = c(0,1,0.950617284,0.3950617284,0,0) # Ordonnées unitaire de la densité de pop (mm rq)
for (i in 1:length(xi_p)){
if (x >= xi_p[i] && x < xi_p[i+1]){
result <- (((yi_p[i+1]-yi_p[i])/(xi_p[i+1]-xi_p[i]))*(x-xi_p[i])+yi_p[i])
}
}
return(result)
}
Cependant, si j'applique cette fonction directement à un data frame ( hab_p_bba1(df)) j’obtiens des valeurs erronées.
J'ai déjà fait quelques recherches, sans succès :
J'ai essayé de l'appliquer à un vecteur de la même manière j'obtiens courbe linéaire de la même pente que la fonction en la première valeur du vecteur.
Sinon, avec une boucle for ou un lapply, j'ai de bons résultats mais malheureusement pas transférable au dataframe (trop long pour la boucle et valeurs bizarres quand reconversion en df pour lapply).
Un exemple vaut mieux que des explications :
Code : Tout sélectionner
x <- seq(0,3,0.05)
y <- c()
for (i in x){
print(i)
y <- append(y,hab_p_bba1(i))
}
plot(x,y)
z <- hab_p_bba1(x)
plot(x,z)
lap <- lapply(X = x, FUN = hab_p_bba1)
plot(x,lap)
PS : ça ne vient pas de la boucle for dans la fonction car j'ai essayé de l'écrire sans boucle, j'ai les mêmes problèmes.
Je ne connais pas bien R (et l'info en général). Mais comme on ne spécifie pas le type de la variable d'entrée et de sortie de la fonction, je me dis qu'il pense peut être que je lui rentre un réel et n’essaie pas d'appliquer la fonction indépendamment à chacune des données.
Quelqu'un aurait une solution à mon problème ?
Merci !