Je suis plutôt débutant dans la création de fonctions sous R, et je rencontre un problème dont j’identifie mal la source.
Je souhaite créer une fonction qui prend en entrée un tableau de données (type data.frame) et 3 chaînes de caractères. La sortie unique est un nouveau tableau de données (toujours de type data.frame), qui correspond à une modification du tableau d’entrée.
Voici la fonction, Tbinomial étant le tableau d'entrée ; Echec, Succès et Varbernoulli étant mes trois chaînes de caractères, qui renvoient dans la fonction à des intitulés de colonne du tableau d'entrée ou de sortie.
Code : Tout sélectionner
Transfobinobernou <- function(Tbinomial, Echec, Succès, Varbernoulli) {
Tbernoulli <- Tbinomial[,-c((ncol(Tbinomial)-1), ncol(Tbinomial))] # Mon nouveau tableau correspond à une troncature du tableau d'entrée. J'enlève les 2 dernières colonnes
Tbernoulli[(nrow(Tbernoulli) + 1) : (sum(Tbinomial[,Echec]) + sum(Tbinomial[,Succès])),] <- NA # Je rajoute un nombre de lignes précis à ce tableau (dépendant des données Echec et Succès du tableau d'entrée), correspondant à l'extension recherchée du tableau de sortie
Tbernoulli[,(ncol(Tbernoulli)+1)] <- 2 # Je rajoute une colonne à ce tableau. Ses dimensions sont maintenant correctes
colnames(Tbernoulli)[ncol(Tbernoulli)] <- Varbernoulli # Je renomme l'intitulé de ma nouvelle variable : mon nouveau tableau est près à être rempli.
j <- 1 # j va parcourir les lignes de mon tableau de sortie
for (i in 1:nrow(Tbernoulli)) { # i parcourt les lignes de mon tableau d'entrée
n1 <- as.numeric(Tbinomial[i, Echec]) # Je récupère le nombre d'échec pour l'expérience binomiale de mon tableau d'entrée
n2 <- as.numeric(Tbinomial[i, Succès]) # Je récupère le nombre de succès pour l'expérience binomiale de mon tableau d'entrée
if (!(n1 == 0)) {
Tbernoulli[j : (j+n1-1), Varbernoulli] <- 0 # Je mets autant de 0 dans le tableau de sortie qu'il y a eu d'échec dans l'expérience
}
if (!(n2 == 0)) {
Tbernoulli[(j+n1) : (j+n1+n2-1), Varbernoulli] <- 1 # Je mets autant de 1 dans le tableau de sortie qu'il y a eu de succès dans l'expérience
}
if (!(n1 + n2 == 0)) {
Tbernoulli[j : (j+n1+n2-1), 1 : (ncol(Tbernoulli)-1)] <- Tbinomial[i, 1 : (ncol(Tbinomial)-2)] # Toutes les données que je viens d'insérer correspondent à la même expérience binomiale. Les autres colonnes sont donc invariantes.
}
j <- j+n1+n2 # Je reprendrai mon tableau de sortie à l'endroit où j'ai terminé de remplir le tableau
}
return(Tbernoulli)
}
Le chargement de la fonction ne pose aucun problème. C’est lorsque je l’utilise avec des données réelles en entrée que j’obtiens un message d’erreur.
R me donne une erreur au moment du test logique ( !(n1 == 0)) au début de la boucle for, il me dit qu’il n’a ni TRUE ni FALSE. Probablement, la comparaison que je lui demande de faire n’a pas de sens lors de l’exécution de la fonction, il doit tomber sur NA. J’en ai déduit :
- que n1 et n2 qui sont calculés au début de ma boucle for ne doivent pas être numérique (sinon la comparaison devrait pouvoir se faire)
- que donc, probablement, mon tableau d’entrée Tbinomial n’est pas reconnu comme un data.frame à l’intérieur de ma fonction. Si tel est le cas je ne vois pas comment faire…
Merci d’avance pour votre aide.
PS : Vous aurez peut-être saisi que je cherche ici à transformer un tableau contenant une variable binomiale (nombre de succès en n expériences de Bernoulli indépendantes) et sa variable complémentaire (nombre d’échec) en un tableau contenant la même donnée mais sous forme d’une variable de Bernoulli (une ligne par expérience de Bernoulli). C’est essentiel pour modéliser les variables sous R avec une famille binomiale. Si vous connaissez une fonction déjà écrite qui fait ça, ça m’intéresse aussi !