Realiser un calcul en fonction de la valeur de chaque cellule

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Maxime Le Roy
Messages : 19
Enregistré le : 07 Mar 2016, 07:27

Realiser un calcul en fonction de la valeur de chaque cellule

Messagepar Maxime Le Roy » 25 Juil 2017, 13:14

Bonjour,

J'aimerai créer un tableau à partir de calculs effectuer sur un autre tableau probablement avec une fonction type tapply()

Voici un extrait de mon tableau :

Code : Tout sélectionner

structure(list(`Agrostis capillaris` = c(0, 0, 1, 0), `Agrostis sp.` = c(0,
11, 0, 0), `Agrostis stolonifera` = c(10L, 11L, 11L, 10L), `Agrostis x murbeckii` = c(0L,
0L, 0L, 0L), `Agrostis X murbeckii` = c(0L, 0L, 0L, 0L)), .Names = c("Agrostis capillaris",
"Agrostis sp.", "Agrostis stolonifera", "Agrostis x murbeckii",
"Agrostis X murbeckii"), row.names = 90:93, class = "data.frame")


Je n'ai pas réussis à renommer mes noms de colonne dans ma boucle d'où provient ce tableau, d'où les noms un peu particuliers...

dans ce tableau je voudrai lire chaque case une par une et appliquer une formule en fonction de la valeur afin de remplir un tableau de type :

Code : Tout sélectionner

Tab_sortie <- data.frame(row.names = c("espece_1", "espece_2", "valeur"))


à savoir :
Si : "11" : remplir les 2 premières colonnes de "Tab_sortie" avec le nom de colonne de "Test" et la 3eme avec "1"
Si : "10" : Remplir la 1ere colonne de "Tab_sortie" avec "Sol nu", la 2ème avec le nom de colonne de "Test" et la 3eme avec une formule (nombre de "11" + nombre de "10" de la colonne) / nombre de valeur != 00 )
Si : "01" : Pour toutes les valeurs "10" et "11" dans la même ligne : remplir la 1ere colonne de "Tab_sortie" avec le nom de colonne et remplir la 2eme colonne de "Tab_sortie" avec le nom de colonne correspondant à la case "01" et remplir la 3eme colonne de "Tab_sortie" avec une formule (1/nombre de valeur de la ligne != 00)

Ici les resultat devatn donner pour la ligne 1 :

Code : Tout sélectionner

espece_1                     Agrostis.stolonifera
espece_2                                   Sol nu
valeur                                          1


puis avec la ligne 2

Code : Tout sélectionner

espece_1 Agrostis.stolonifera Agrostis.sp Agrostis.stolonifera
espece_2               Sol nu Agrostis.sp Agrostis.stolonifera
valeur                      1           1                    1


Enfin avec la ligne 3

Code : Tout sélectionner

espece_1 Agrostis.stolonifera Agrostis.sp Agrostis.stolonifera Agrostis.stolonifera Agrostis.stolonifera
espece_2               Sol nu Agrostis.sp Agrostis.stolonifera Agrostis.stolonifera  Agrostis.capillaris
valeur                      1           1                    1                    1                  0.5
espece_1              Sol nu
espece_2 Agrostis.capillaris
valeur                   0.5


J'espère que la demande est relativement claire ?
si vous pouviez me donner une piste au moins por le codage du premier : Si : "11" : remplir les 2 premières colonnes de "Tab_sortie" avec le nom de colonne de "Test" et la 3eme avec "1"
je pense pouvoir adapter cela au reste (qui n'est pas forcément très clair) par la suite.

Je vous remercie !

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Realiser un calcul en fonction de la valeur de chaque cellule

Messagepar Pierre-Yves Berrard » 25 Juil 2017, 18:09

Bonjour,

Si je comprends bien (c'est un peu touffu), selon la valeur de la case, "valeur" dépend sur la case elle-même (11), de l'ensemble de la colonne sur laquelle la case est située (10) ou de l'ensemble de la ligne sur laquelle la case est située (01) ?
PY

Maxime Le Roy
Messages : 19
Enregistré le : 07 Mar 2016, 07:27

Re: Realiser un calcul en fonction de la valeur de chaque cellule

Messagepar Maxime Le Roy » 26 Juil 2017, 08:51

Bonjour,
oui si c'est 11 la valeur sera toujours de 1 et donc dépend de sa case uniquement.
Pour les 2 autres (01) et (10), cela dépendra des autres valeurs de la ligne sur laquelle la case est située (et du nom de la colonne)
J'ai édité mon post précedent pour simplifier un peu les codes
voici ce que j'ai commencé à faire à partir du tableau "Trans" :


Code : Tout sélectionner

Trans <- structure(list(`Agrostis capillaris` = c(0, 0, 1, 0), `Agrostis sp.` = c(0,
11, 0, 0), `Agrostis stolonifera` = c(10L, 11L, 11L, 10L), `Agrostis x murbeckii` = c(0L,
0L, 0L, 0L), `Agrostis X murbeckii` = c(0L, 0L, 0L, 0L)), .Names = c("Agrostis capillaris",
"Agrostis sp.", "Agrostis stolonifera", "Agrostis x murbeckii",
"Agrostis X murbeckii"), row.names = 90:93, class = "data.frame")

t11<-as.vector(names(Trans)[apply(Trans=="11",FUN=sum, MARGIN=2)>0])  #  Extraire les nom de colonnes avec une valeur "11"

Tab_sortie <- data.frame(row.names = c("espece_1", "espece_2", "valeur")) # Création du tableau final

for (i in t11){
  Tab_sortie <- cbind(Tab_sortie, c(i,i,"1")) # pour chaque colonne avec une valeur "11" remplir le tableau
}

t10<-as.vector(names(Trans)[apply(Trans=="10",FUN=sum, MARGIN=2)>0]) #extraire nom des colonnes
row_t10<-as.vector(row.names(Trans)[apply(Trans=="10",FUN=sum, MARGIN=1)>0]) #extraire nom des lignes

coord_t10 <- cbind(col=t10, row=row_t10) #Création d'un tableau à 2 colonnes correspondant aux coordonnées de chacun des points avec "10"

for (j in 1:nrow(coord_t10)){
 
  Valeur <- (sum(Trans[coord_t10[j,2],]=="11")+sum(coord_t10[j,2]=="10"))/sum(coord_t10[j,2]!="0")
  Tab_sortie <- cbind(Tab_sortie, c(coord_t10[j,1],"SolNu",))
}



Le problème est que la fonction

Code : Tout sélectionner

t11<-as.vector(names(Trans)[apply(Trans=="11",FUN=sum, MARGIN=2)>0])
ne rentre qu'une seule fois "Agrostis.stolonifera" alors qu'il y a plusieurs "11" dans cette colonne. Il faudrait donc que le nom de la colonne soit écrit, ici 2 fois.
Auriez vous une idée pour me débloquer sur ce problème, je pourrais ensuite adapter la suite du script par moi même je pense.

Je vous remercie !

Charles Marcucci
Messages : 52
Enregistré le : 13 Juil 2016, 09:00

Re: Realiser un calcul en fonction de la valeur de chaque cellule

Messagepar Charles Marcucci » 26 Juil 2017, 09:19

BOnjour

Pour résoudre ton problème je remplirai le vecteur T11 avec un boucle
Je commencerai par cree un vecteur avec x variable
puis je cree une boucle qui remplie la valeur d'indice [i] quand elle detecte un 11.

Il y a peut etre une autre solution mais les boucle for associé a la fonction if m'ont permit de résoudre beaucoup de problème.

Cordialement

Maxime Le Roy
Messages : 19
Enregistré le : 07 Mar 2016, 07:27

Re: Realiser un calcul en fonction de la valeur de chaque cellule

Messagepar Maxime Le Roy » 26 Juil 2017, 13:11

Bonjour,
Merci pour le conseil !
j'ai réussi à faire comme cela, un if das une boucle.

Code : Tout sélectionner


Nom_sp <- names(Trans)
Nom_releves <- row.names(Trans)
coord_t11 <- c("col","row")

for (i in 1:length(Nom_sp))
{
  for (j in 1:length(Nom_releves))
  {
    if (Trans[j,i]=="11")
      coord_t11<-rbind(coord_t11,c(Nom_sp[i],Nom_releves[j])) # tableau avec coord de tous point 11
  }
}


J'ai réussis à coder la suite , je vous remercie tous les deux.

Bien cordialement.

Charles Marcucci
Messages : 52
Enregistré le : 13 Juil 2016, 09:00

Re: Realiser un calcul en fonction de la valeur de chaque cellule

Messagepar Charles Marcucci » 26 Juil 2017, 13:13

mais de rien


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité