Calcul sur dataframe (type excel)

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

Alexis Rosa
Messages : 11
Enregistré le : 04 Nov 2020, 13:56

Calcul sur dataframe (type excel)

Messagepar Alexis Rosa » 06 Nov 2020, 11:30

Bonjour,

Je cherche à automatiser des calculs excels avec R.
Petit problème je n'ai que peu d'idée de comment faire...

Je dois calculer une moyenne corrigée.
J'ai donc séparé mon data frame en 2 : un dataframe avec les données à corrigé, et un autre avec la correction à appliquer. J'ai créer une nouvelle colonne remplis de 0 afin d'y rentrer les futurs moyennes corrigées.
Voici des extraits des deux datasframes :

Moyenne corrigée (dtamoy_filter) :
Hour Fluor Target Sample Cq.1 Cq.2 Cq.3 Sd Moyenne Moyenne_corrigée
1 32h SYBR FASN Am 1 24.12 24.45 23.93 0.26312228 24.16667 0
2 32h SYBR FASN Am 2,5 25.95 25.84 25.55 0.20663978 25.78000 0
3 32h SYBR FASN DMSO 0,1% 25.79 25.28 25.40 0.26664583 25.49000 0
4 32h SYBR FASN EtOH 1% 24.69 24.62 24.62 0.04041452 24.64333 0
5 32h SYBR FASN EtOH 2% 24.86 25.13 24.85 0.15885003 24.94667 0
6 32h SYBR FASN iOc 24.62 24.79 24.75 0.08888194 24.72000 0
7 32h SYBR FASN Val 10 25.18 25.28 24.89 0.20256686 25.11667 0
8 32h SYBR FASN Val 100 24.69 24.76 24.65 0.05567764 24.70000 0
9 32h SYBR FASN Val 50 25.54 25.85 25.76 0.15947832 25.71667 0
10 32h SYBR SCD1 Am 1 27.50 27.83 27.37 0.23713569 27.56667 0
11 32h SYBR SCD1 Am 2,5 30.21 29.44 29.68 0.39399662 29.77667 0
12 32h SYBR SCD1 DMSO 0,1% 30.36 29.44 30.16 0.48387326 29.98667 0
13 32h SYBR SCD1 EtOH 1% 28.31 28.73 28.38 0.22501852 28.47333 0
14 32h SYBR SCD1 EtOH 2% 28.40 28.36 28.49 0.06658328 28.41667 0
15 32h SYBR SCD1 iOc 29.12 29.20 28.87 0.17214335 29.06333 0
16 32h SYBR SCD1 Val 10 29.27 29.19 29.27 0.04618802 29.24333 0
17 32h SYBR SCD1 Val 100 28.88 28.80 28.73 0.07505553 28.80333 0
18 32h SYBR SCD1 Val 50 29.37 29.27 29.48 0.10503968 29.37333 0
19 32h SYBR TFa Am 1 21.10 21.13 21.34 0.13076697 21.19000 0
20 32h SYBR TFa Am 2,5 22.79 22.47 22.64 0.16010413 22.63333 0

Moyenne correction (dtahkali) :
Hour Sample 1 2 3 MoyenneHk
1 32h Am 1 20.77333 19.87667 17.94333 19.53111
2 32h Am 2,5 22.05000 21.19333 19.20000 20.81444
3 32h DMSO 0,1% 20.94333 19.57333 18.68000 19.73222
4 32h EtOH 1% 21.36333 18.30333 18.52000 19.39556
5 32h EtOH 2% 21.64000 19.12333 18.64000 19.80111
6 32h iOc 20.90000 19.25000 18.22333 19.45778
7 32h Val 10 21.34333 19.42667 19.26667 20.01222
8 32h Val 100 21.39500 19.51000 18.40333 19.76944
9 32h Val 50 22.40667 20.43000 19.20333 20.68000
10 48h Am 1 21.46333 18.82333 19.12333 19.80333
11 48h DMSO 0,01% 20.04667 18.65667 18.22000 18.97444

Le calcul est le suivant : Je dois pour un sample et une heure donnée corriger la moyenne
ex : à 32h et pour Am1, la moyenne à corrigée est de 24, 16667, la moyennehk est de 19,53111, la moyenne corrigée sera donc 24,16667 - 19,53111 = 4,63556

J'ai créer le code suivant afin d'y parvenir mais il ne fonctionne pas :

Code : Tout sélectionner

l = length(dtamoy_filter$Hour)
p = length(dtahkali$Hour)
Moyenne_corrigée = rep(0,l)
dtamoy_filter = data.frame(dtamoy_filter, Moyenne_corrigée)
while (i < l){
  while (j <= p){
    if (dtamoy_filter$Sample[i] == dtahkali$Sample[j]){
      dtamoy_filter$Moyenne_corrigée[i] = dtamoy_filter$Moyenne[i] - dtahkali$MoyenneHk[j]
      i = i+1
      j = j+1
    }
    while (i != l){
      if (j=p){
         j = 1
      }
    }
  }
}


Le message d'erreur suivant s'affiche :
Erreur : '=' inattendu(e) in:
" while (i != l){
if (j="

Auriez vous une solution ? Est-ce que je me complique la vie en séparant mon dataframe en 2 ? Y a t-il des fonctions qui permettent de faire des calculs "comme" sur Excel sans passer par des boucles ? Une case moins une autre, répétez l'opération, ...

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

Re: Calcul sur dataframe (type excel)

Messagepar Pierre-Yves Berrard » 06 Nov 2020, 12:05

Bonjour, il s'agit d'une erreur de syntaxe if (j == p).

NB : un peu de lecture sur comment insérer des données qui puissent être réutilisables : viewtopic.php?t=3302
PY

Alexis Rosa
Messages : 11
Enregistré le : 04 Nov 2020, 13:56

Re: Calcul sur dataframe (type excel)

Messagepar Alexis Rosa » 06 Nov 2020, 14:05

Merci encore une fois, c'était une erreur bête..
J'ai un peu modifié mon code :

Code : Tout sélectionner

l = length(dtamoy_filter$Hour)
p = length(dtahkali$Hour)
Moyenne_corrigée = rep(0,l)
dtamoy_filter = data.frame(dtamoy_filter, Moyenne_corrigée)
i=1
j=1
while (dtamoy_filter$Moyenne_corrigée[l] == 0){
    if ((dtamoy_filter$Sample[i] == dtahkali$Sample[j]) & (dtamoy_filter$Hour[i] == dtahkali$Hour[j])){
      dtamoy_filter$Moyenne_corrigée[i] = dtamoy_filter$Moyenne[i] - dtahkali$MoyenneHk[j]
      i = i+1
      j = j+1
      if (j==p){
        j=1
      }
    }else{
      i = i+1
    }
  }


Cependant il ne fonctionne pas. L'erreur suivante s'affiche : Error in if ((dtamoy_filter$Sample[i] == dtahkali$Sample[j]) & (dtamoy_filter$Hour[i] == : valeur manquante là où TRUE / FALSE est requis
J'ai lu que c'était à cause d'un dépassement de valeur d'indice. Effectivement mon indice i vaut 81. Je ne sais pas comment arranger le problème...

Merci pour la remarque sur l'insertion de données et désolé pour mes précédents postes peu efficace à ce propos. Je serais désormais plus vigilant. La fonction dput() est censée faire apparaitre le tableau lorsqu'il est dans un code ?

Alexis

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

Re: Calcul sur dataframe (type excel)

Messagepar Pierre-Yves Berrard » 06 Nov 2020, 15:23

La fonction dput renvoie un code qui, si on le réexécute, produit exactement l'objet que vous lui avez passé.
Il faut coller ici (dans un bloc de code idéalement) le résultat de dput(donnes_que_vous_voulez_partager).

Pourriez-vous éditer votre 1er message dans ce sens ?
PY

Alexis Rosa
Messages : 11
Enregistré le : 04 Nov 2020, 13:56

Re: Calcul sur dataframe (type excel)

Messagepar Alexis Rosa » 06 Nov 2020, 16:25

Voila donc les deux dataframes avec la fonction dput().

Moyenne à corriger :

Code : Tout sélectionner

   Heure Traitement  Moyenne Cible
1    32h          A 15.98900   Apa
2    32h          B 19.85450   Apa
3    32h          C 20.69315   Apa
4    32h          A 21.09861   ola
5    32h          B 19.38620   ola
6    32h          C 17.60900   ola
7    48h          A 25.79176   Apa
8    48h          D 30.94591   Apa
9    48h          A 28.07944   ola
10   48h          D 22.19720   ola


Moyenne corriger :

Code : Tout sélectionner

  Heure Traitement Moyenne Correction
1    32h          A           12.59500
2    32h          B           17.85450
3    32h          C           19.69315
4    48h          A           18.09861
5    48h          D           16.38620


Merci,
Alexis

Alexis Rosa
Messages : 11
Enregistré le : 04 Nov 2020, 13:56

Re: Calcul sur dataframe (type excel)

Messagepar Alexis Rosa » 09 Nov 2020, 09:33

En creusant mon problème j'ai résolu ce dernier ! :)

Merci PY pour ton aide sur l'insertion de données.

Cordialement,
Alexis


Retourner vers « Questions en cours »

Qui est en ligne

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