Moyenner des données selon une condition, avoir les SD et créer un nouveau fichier

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

margot julien
Messages : 46
Enregistré le : 28 Nov 2017, 12:10

Moyenner des données selon une condition, avoir les SD et créer un nouveau fichier

Messagepar margot julien » 08 Nov 2021, 08:06

Bonjour,

j'aimerais moyenner des données et avoir les sd de certaines colonnes selon des combinaisons de facteurs dans d'autres colonnes qui eux seraient reportés et donc dupliqués pour avoir tout ça dans un nouveau tableau mais j'ai quelques soucis. Voici ce que j'essaye de faire en détail:

#lecture du fichier

Code : Tout sélectionner

fi<-read.csv2("F:\\example.csv")


#je veux moyenner les données qui ont les mêmes: "cp", "year" et "varietyNumber" donc j'ai créé une colonne avec un facteur commun pour faire les moyennes, donc "cp_year_varietyNumber" comme ceci:

Code : Tout sélectionner

fi$cp_year_varietyNumber<-paste(fi$cp, fi$year, fi$varietyNumber)



#ensuite j'ai converti les colonnes à moyenner en numérique, càd dans mon exemple colonnes 1,2, 7,8, 10 et 11 comme ceci:

Code : Tout sélectionner

for (i in 1:2) { 
  fi[, i] <- as.numeric(as.character(fi[, i]))
}

for (i in 7:8) { 
  fi[, i] <- as.numeric(as.character(fi[, i]))
}

for (i in 10:11) { 
  fi[, i] <- as.numeric(as.character(fi[, i]))
}

str(fi)


Ici c'est important que je puisse appeler les colonnes par série avec le numéro de colonne et pas le nom car dans mon vrai fichier j'ai énormément de colonnes.

#Je calcule les moyennes pour les colonnes en question et je renomme la colonne pour savoir que ce sont des moyennes:

Code : Tout sélectionner

Means1<-apply(fi[,1:2],2,tapply, fi$cp_year_varietyNumber, mean, na.rm=T)
Means1_new <- Means1 #nouveaux noms de colonnes pour préciser que ce sont des moyennes                                       
colnames(Means1_new) <- paste0("means_", colnames(Means1_new))  # Add prefix
Means1_new

Means2<-apply(fi[,7:8],2,tapply, fi$cp_year_varietyNumber, mean, na.rm=T)
Means2_new <- Means2 #nouveaux noms de colonnes pour préciser que ce sont des moyennes                                       
colnames(Means2_new) <- paste0("means_", colnames(Means2_new))  # Add prefix
Means2_new

Means3<-apply(fi[,10:11],2,tapply, fi$cp_year_varietyNumber, mean, na.rm=T)
Means3_new <- Means3 #nouveaux noms de colonnes pour préciser que ce sont des moyennes                                       
colnames(Means3_new) <- paste0("means_", colnames(Means3_new))  # Add prefix
Means3_new

#Ensuite je calcule les sd et je renomme la colonne pour savoir que ce sont des SD:

Code : Tout sélectionner

sds1<-apply(fi[,1:2],2,tapply, fi$cp_year_varietyNumber, sd, na.rm=T)
sds1_new <- sds1 #nouveaux noms de colonnes pour préciser que ce sont des moyennes                                       
colnames(sds1_new) <- paste0("sd_", colnames(sds1_new))  # Add prefix
sds1_new

sds2<-apply(fi[,7:8],2,tapply, fi$cp_year_varietyNumber, sd, na.rm=T)
sds2_new <- sds2 #nouveaux noms de colonnes pour préciser que ce sont des moyennes                                       
colnames(sds2_new) <- paste0("sd_", colnames(sds2_new))  # Add prefix
sds2_new

sds3<-apply(fi[,10:11],2,tapply, fi$cp_year_varietyNumber, sd, na.rm=T)
sds3_new <- sds3 #nouveaux noms de colonnes pour préciser que ce sont des moyennes                                       
colnames(sds3_new) <- paste0("sd_", colnames(sds3_new))  # Add prefix
sds3_new


#Ensuite je veux réunir les données moyennées et les colonnes avec les sd avec le fichier de départ fi:

#je réuni les données calculées

Code : Tout sélectionner

all<-cbind(Means1_new, Means2_new, Means3_new, sds1_new, sds2_new, sds3_new)
all

#et je copie les données non moyennées qui sont identiques par "fi$cp_year_varietyNumber"

Code : Tout sélectionner

all2<-cbind(fi, all)
all2



Mon souci ici est que j'ai un warning message, savez-vous si cela est grave?
#Warning message:
# In data.frame(..., check.names = FALSE) :
# les noms de lignes sont trouvés dans une variable courte et ont été éliminés


De plus mon vrai fichier étant énorme, je pense que la manière de faire ceci n'est pas optimale. Auriez-vous une idée de comment améliorer mon code pour faire ça?

Voici le fichier Excel "fi" ci-dessous inséré avec "dput".

Merci par avance.

Fichier:

Code : Tout sélectionner

fi<-structure(list(yield = c(20L, 30L, 40L, 50L, NA, 2L, NA, 1L,
20L, 30L, 40L, 50L, NA, 2L, NA, 1L, 20L, 30L, 40L, 50L, NA, 2L,
NA, 1L, 20L, 30L, 40L, 50L, NA, 2L, NA, 1L, 20L, 30L, 40L, 50L,
NA, 2L, NA, 1L, 20L, 30L, 40L, 50L, NA, 2L, NA, 1L), height = c("2",
"5.2", "4", "6.3", "1.2", NA, NA, "2", "2", "5.2", "4", "6.3",
"1.2", NA, NA, "2", "2", "5.2", "4", "6.3", "1.2", NA, NA, "2",
"2", "5.2", "4", "6.3", "1.2", NA, NA, "2", "2", "5.2", "4",
"6.3", "1.2", NA, NA, "2", "2", "5.2", "4", "6.3", "1.2", NA,
NA, "2"), year = c(2000L, 2000L, 2000L, 2000L, 2000L, 2000L,
2000L, 2000L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L,
2001L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L,
2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2000L,
2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2005L, 2005L,
2005L, 2005L, 2005L, 2005L, 2005L, 2005L), cp = c(1250L, 1250L,
1250L, 1250L, 1250L, 1250L, 1250L, 1250L, 1250L, 1250L, 1250L,
1250L, 1250L, 1250L, 1250L, 1250L, 1260L, 1260L, 1260L, 1260L,
1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L,
1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L,
1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L,
1260L), variety = c("var1", "var3", "varb", "varb", "var1", "varb",
"var3", "var3", "var1", "var3", "varb", "varb", "var1", "varb",
"var3", "var3", "var1", "var3", "varb", "varb", "var1", "varb",
"var3", "var3", "var1", "var3", "varb", "varb", "var1", "varb",
"var3", "var3", "var4", "var3", "varb", "varb", "var4", "varb",
"var3", "var3", "var4", "var3", "varb", "varb", "var4", "varb",
"var3", "var3"), varietyNumber = c("1", "3", "-2", "-2", "1",
"-2", "3", "3", "1", "3", "-2", "-2", "1", "-2", "3", "3", "1",
"3", "-2", "-2", "1", "-2", "3", "3", "1", "3", "-2", "-2", "1",
"-2", "3", "3", "5.2", "3", "-2", "-2", "5.2", "-2", "3", "3",
"5.2", "3", "-2", "-2", "5.2", "-2", "3", "3"), ad1 = c(NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), ad2 = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
    lieu = c("lieu1", "lieu1", "lieu1", "lieu1", "lieu1", "lieu1",
    "lieu1", "lieu1", "lieu1", "lieu1", "lieu1", "lieu1", "lieu1",
    "lieu1", "lieu1", "lieu1", "lieu2", "lieu2", "lieu2", "lieu2",
    "lieu2", "lieu2", "lieu2", "lieu2", "lieu2", "lieu2", "lieu2",
    "lieu2", "lieu2", "lieu2", "lieu2", "lieu2", "lieu3", "lieu3",
    "lieu3", "lieu3", "lieu3", "lieu3", "lieu3", "lieu3", "lieu3",
    "lieu3", "lieu3", "lieu3", "lieu3", "lieu3", "lieu3", "lieu3"
    ), yield2 = c(20L, 30L, 40L, 50L, NA, 2L, NA, 1L, 20L, 30L,
    40L, 50L, NA, 2L, NA, 1L, 20L, 30L, 40L, 50L, NA, 2L, NA,
    1L, 20L, 30L, 40L, 50L, NA, 2L, NA, 1L, 20L, 30L, 40L, 50L,
    NA, 2L, NA, 1L, 20L, 30L, 40L, 50L, NA, 2L, NA, 1L), height2 = c("2",
    "5.2", "4", "6.3", "1.2", NA, NA, "2", "2", "5.2", "4", "6.3",
    "1.2", NA, NA, "2", "2", "5.2", "4", "6.3", "1.2", NA, NA,
    "2", "2", "5.2", "4", "6.3", "1.2", NA, NA, "2", "2", "5.2",
    "4", "6.3", "1.2", NA, NA, "2", "2", "5.2", "4", "6.3", "1.2",
    NA, NA, "2")), class = "data.frame", row.names = c(NA, -48L
))

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Moyenner des données selon une condition, avoir les SD et créer un nouveau fichier

Messagepar Mickael Canouil » 10 Nov 2021, 11:31

Bonjour,

Beaucoup trop de répétitions dans le code ce qui le rend excessivement difficile à lire et/ou débuguer.
https://fr.wikipedia.org/wiki/Ne_vous_r ... %A9tez_pas

J'avoue ne pas même comprendre à quoi le résultat ressemble ou doit ressembler.

Votre code (faire des séquences de ici n'aide pas à la compréhension et n'apporte rien à l'ecriture d'un vecteur) :

Code : Tout sélectionner

for (i in 1:2) { 
  fi
[, i] <- as.numeric(as.character(fi[, i]))
}

for (i in 7:8) { 
  fi
[, i] <- as.numeric(as.character(fi[, i]))
}

for (i in 10:11) { 
  fi
[, i] <- as.numeric(as.character(fi[, i]))
}


Ce qu'il aurait fallu écrire à minima :

Code : Tout sélectionner

for (i in c(1, 2, 7, 8, 10, 11)) { 
  fi
[, i] <- as.numeric(as.character(fi[, i]))
}


EDIT : si j'ai compris l'objectif :

Code : Tout sélectionner

fi<-structure(list(yield = c(20L, 30L, 40L, 50L, NA, 2L, NA, 1L,
20L, 30L, 40L, 50L, NA, 2L, NA, 1L, 20L, 30L, 40L, 50L, NA, 2L,
NA, 1L, 20L, 30L, 40L, 50L, NA, 2L, NA, 1L, 20L, 30L, 40L, 50L,
NA, 2L, NA, 1L, 20L, 30L, 40L, 50L, NA, 2L, NA, 1L), height = c("2",
"5.2", "4", "6.3", "1.2", NA, NA, "2", "2", "5.2", "4", "6.3",
"1.2", NA, NA, "2", "2", "5.2", "4", "6.3", "1.2", NA, NA, "2",
"2", "5.2", "4", "6.3", "1.2", NA, NA, "2", "2", "5.2", "4",
"6.3", "1.2", NA, NA, "2", "2", "5.2", "4", "6.3", "1.2", NA,
NA, "2"), year = c(2000L, 2000L, 2000L, 2000L, 2000L, 2000L,
2000L, 2000L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L,
2001L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L,
2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2000L,
2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2005L, 2005L,
2005L, 2005L, 2005L, 2005L, 2005L, 2005L), cp = c(1250L, 1250L,
1250L, 1250L, 1250L, 1250L, 1250L, 1250L, 1250L, 1250L, 1250L,
1250L, 1250L, 1250L, 1250L, 1250L, 1260L, 1260L, 1260L, 1260L,
1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L,
1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L,
1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L, 1260L,
1260L), variety = c("var1", "var3", "varb", "varb", "var1", "varb",
"var3", "var3", "var1", "var3", "varb", "varb", "var1", "varb",
"var3", "var3", "var1", "var3", "varb", "varb", "var1", "varb",
"var3", "var3", "var1", "var3", "varb", "varb", "var1", "varb",
"var3", "var3", "var4", "var3", "varb", "varb", "var4", "varb",
"var3", "var3", "var4", "var3", "varb", "varb", "var4", "varb",
"var3", "var3"), varietyNumber = c("1", "3", "-2", "-2", "1",
"-2", "3", "3", "1", "3", "-2", "-2", "1", "-2", "3", "3", "1",
"3", "-2", "-2", "1", "-2", "3", "3", "1", "3", "-2", "-2", "1",
"-2", "3", "3", "5.2", "3", "-2", "-2", "5.2", "-2", "3", "3",
"5.2", "3", "-2", "-2", "5.2", "-2", "3", "3"), ad1 = c(NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), ad2 = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
    lieu = c("lieu1", "lieu1", "lieu1", "lieu1", "lieu1", "lieu1",
    "lieu1", "lieu1", "lieu1", "lieu1", "lieu1", "lieu1", "lieu1",
    "lieu1", "lieu1", "lieu1", "lieu2", "lieu2", "lieu2", "lieu2",
    "lieu2", "lieu2", "lieu2", "lieu2", "lieu2", "lieu2", "lieu2",
    "lieu2", "lieu2", "lieu2", "lieu2", "lieu2", "lieu3", "lieu3",
    "lieu3", "lieu3", "lieu3", "lieu3", "lieu3", "lieu3", "lieu3",
    "lieu3", "lieu3", "lieu3", "lieu3", "lieu3", "lieu3", "lieu3"
    ), yield2 = c(20L, 30L, 40L, 50L, NA, 2L, NA, 1L, 20L, 30L,
    40L, 50L, NA, 2L, NA, 1L, 20L, 30L, 40L, 50L, NA, 2L, NA,
    1L, 20L, 30L, 40L, 50L, NA, 2L, NA, 1L, 20L, 30L, 40L, 50L,
    NA, 2L, NA, 1L, 20L, 30L, 40L, 50L, NA, 2L, NA, 1L), height2 = c("2",
    "5.2", "4", "6.3", "1.2", NA, NA, "2", "2", "5.2", "4", "6.3",
    "1.2", NA, NA, "2", "2", "5.2", "4", "6.3", "1.2", NA, NA,
    "2", "2", "5.2", "4", "6.3", "1.2", NA, NA, "2", "2", "5.2",
    "4", "6.3", "1.2", NA, NA, "2", "2", "5.2", "4", "6.3", "1.2",
    NA, NA, "2")), class = "data.frame", row.names = c(NA, -48L
))

Code : Tout sélectionner

(
  mean_sd_data <- do.call(# to flatten column names
    what = "data.frame", 
    args 
= aggregate(
      x = lapply(fi[c(1, 2, 7, 8, 10, 11)], as.numeric), # instead of a for loop and without modifying the actual data
      by =  fi[c("cp", "variety", "varietyNumber")],
      FUN = function(x) c(mean = mean(x, na.rm = TRUE), sd = sd(x, na.rm = TRUE)) # named vector with the things we want to compute on each colums, i.e., c(1, 2, 7, 8, 10, 11) of "fi"
    )
  )
)
#>     cp variety varietyNumber yield.mean yield.sd height.mean height.sd ad1.mean ad1.sd ad2.mean ad2.sd yield2.mean yield2.sd height2.mean height2.sd
#> 1 1250    varb            -2   30.66667 22.65097        5.15 1.3279056      NaN     NA      NaN     NA    30.66667  22.65097         5.15  1.3279056
#> 2 1260    varb            -2   30.66667 21.59686        5.15 1.2294017      NaN     NA      NaN     NA    30.66667  21.59686         5.15  1.2294017
#> 3 1250    var1             1   20.00000  0.00000        1.60 0.4618802      NaN     NA      NaN     NA    20.00000   0.00000         1.60  0.4618802
#> 4 1260    var1             1   20.00000  0.00000        1.60 0.4618802      NaN     NA      NaN     NA    20.00000   0.00000         1.60  0.4618802
#> 5 1250    var3             3   15.50000 16.74316        3.60 1.8475209      NaN     NA      NaN     NA    15.50000  16.74316         3.60  1.8475209
#> 6 1260    var3             3   15.50000 15.50115        3.60 1.7104719      NaN     NA      NaN     NA    15.50000  15.50115         3.60  1.7104719
#> 7 1260    var4           5.2   20.00000  0.00000        1.60 0.4618802      NaN     NA      NaN     NA    20.00000   0.00000         1.60  0.4618802 

Code : Tout sélectionner

head(
  
merge(fimean_sd_databy c("cp""variety""varietyNumber"))
)
#>     cp variety varietyNumber yield height year ad1 ad2  lieu yield2 height2 yield.mean yield.sd height.mean height.sd ad1.mean ad1.sd ad2.mean ad2.sd yield2.mean yield2.sd height2.mean height2.sd
#> 1 1250    var1             1    20      2 2000  NA  NA lieu1     20       2       20.0  0.00000         1.6 0.4618802      NaN     NA      NaN     NA        20.0   0.00000          1.6  0.4618802
#> 2 1250    var1             1    NA    1.2 2000  NA  NA lieu1     NA     1.2       20.0  0.00000         1.6 0.4618802      NaN     NA      NaN     NA        20.0   0.00000          1.6  0.4618802
#> 3 1250    var1             1    20      2 2001  NA  NA lieu1     20       2       20.0  0.00000         1.6 0.4618802      NaN     NA      NaN     NA        20.0   0.00000          1.6  0.4618802
#> 4 1250    var1             1    NA    1.2 2001  NA  NA lieu1     NA     1.2       20.0  0.00000         1.6 0.4618802      NaN     NA      NaN     NA        20.0   0.00000          1.6  0.4618802
#> 5 1250    var3             3    30    5.2 2000  NA  NA lieu1     30     5.2       15.5 16.74316         3.6 1.8475209      NaN     NA      NaN     NA        15.5  16.74316          3.6  1.8475209
#> 6 1250    var3             3     1      2 2001  NA  NA lieu1      1       2       15.5 16.74316         3.6 1.8475209      NaN     NA      NaN     NA        15.5  16.74316          3.6  1.8475209
 


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

margot julien
Messages : 46
Enregistré le : 28 Nov 2017, 12:10

Re: Moyenner des données selon une condition, avoir les SD et créer un nouveau fichier

Messagepar margot julien » 19 Nov 2021, 13:07

Bonjour,

merci beaucoup, c'est parfait, ça fonctionne et c'est vrai que c'est beaucoup plus optimal.

Cordialement.

margot julien
Messages : 46
Enregistré le : 28 Nov 2017, 12:10

Re: Moyenner des données selon une condition, avoir les SD et créer un nouveau fichier

Messagepar margot julien » 19 Nov 2021, 13:55

j'ai encore une question svp, ici j'ai donc des moyennes et sd en fonction de "cp", "year" et "varietyNumber" donc le fichier "mean_sd_data" a une dimension de 16 lignes. Ensuite le fichier final "final" (= merge de fi et mean_sd_data) mergé par "cp", "year"et "varietyNumber" fait donc la même taille que le fichier de départ "fi", càd 48 lignes.

Comment puis-je faire si je veux que mon fichier final fasse 16 lignes, c'est à dire que j'aimerais avoir une ligne par moyenne comme dans le fichier "mean_sd_data" sauf que j'aimerais ajouter les colonnes du fichier fi identiques qui auront donc le même nom pour les 3 données moyennées (cp, year, varietyNumber, variety).

Par exemple dans le fichier final pour cp = 1250, year = 2000 et varietyNumber = -2 j'ai une "yield.mean" de 30.66667 et j'ai le détail des 3 données de la colonne "yield" qui ont été moyennées.

J'aimerais ne pas avoir les colonnes numériques qui ont servi pour faire les moyennes mais avoir uniquement une ligne par moyenne mais avec quand même les colonnes identiques c'est à dire dans cet exemple: cp =1250, varietyNumber= -2 et year = 2000 qui ont servi de facteur commun, mais aussi par exemple ajouter la colonne "variety" et donc avoir un fichier final de 16 lignes.

merci par avance.

voici le code actuel:

Code : Tout sélectionner

for (i in c(1, 2, 7, 8, 10, 11)) {
  fi[, i] <- as.numeric(as.character(fi[, i]))
}


(
  mean_sd_data <- do.call(# to flatten column names
    what = "data.frame",
    args = aggregate(
    x = lapply(fi[c(1, 2, 7, 8, 10, 11)], as.numeric), # instead of a for loop and without modifying the actual data
      by =  fi[c("cp", "year", "varietyNumber")],
      FUN = function(x) c(mean = mean(x, na.rm = TRUE), sd = sd(x, na.rm = TRUE)) # named vector with the things we want to compute on each colums, i.e., c(1, 2, 7, 8, 10, 11) of "fi"
    )
  )
)

dim(mean_sd_data)

final<-(
  merge(x = fi, y = mean_sd_data, by = c("cp", "year", "varietyNumber"))
)
dim(final)

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Moyenner des données selon une condition, avoir les SD et créer un nouveau fichier

Messagepar Mickael Canouil » 23 Nov 2021, 09:21

Je ne comprends pas le résultat souhaité ...
N'est-ce pas juste `mean_sd_data` que vous voulez alors ?

Rien ne vous empêche d'exclure les colonnes que vous ne voulez pas (ou sélectionner celles que vous voulez) comme vous feriez pour n'importe qu'elle data.frame ou autre structure équivalente.
Mickaël
mickael.canouil.fr | rlille.fr

margot julien
Messages : 46
Enregistré le : 28 Nov 2017, 12:10

Re: Moyenner des données selon une condition, avoir les SD et créer un nouveau fichier

Messagepar margot julien » 26 Nov 2021, 09:55

Oui merci, je vais supprimer les lignes que je ne veux pas.

Merci pour les différents codes.

Guilhem Freche
Messages : 11
Enregistré le : 01 Avr 2020, 08:45

Re: Moyenner des données selon une condition, avoir les SD et créer un nouveau fichier

Messagepar Guilhem Freche » 13 Juil 2022, 21:39

Bonjour,
je recherche à réaliser quelque chose de semblable avec des conditions supplémentaire.
En effet, je souhaite que les moyennes soit réalisées sur les 2 dernières lignes qui remplisse la condition : by = donnees[c("voie", "time")]
Je souhaite également récupérer la dernière valeur du timestamp dans le nouveau dateframe
Voici le code :

Code : Tout sélectionner

donnees<-data.frame(
  timestamp = c("2022-01-03 03:00:00","2022-01-03 03:10:00","2022-01-03 03:20:00","2022-01-03 03:30:00",
                "2022-01-03 03:40:00","2022-01-03 03:50:00","2022-01-03 04:00:00","2022-01-03 04:10:00"),
  voie = c("B_1","B_1","B_1","B_1","B_2","B_2","B_2","B_2"),
  time = c(0,100,100,100,0,100,100,100),
  Temp = c(1,1,6,7,1,1,8,9))

mean_sd_donnees <- do.call(# to flatten column names
    what = "data.frame",
    args = aggregate(
      x = donnees[4], # instead of a for loop and without modifying the actual data
      by =  donnees[c("voie", "time")],
      FUN = function(x) c(mean = mean(x, na.rm = TRUE), sd = sd(x, na.rm = TRUE)) # named vector with the things we want to compute on each colums, i.e., c(1, 2, 7, 8, 10, 11) of "fi")
  )


En image voici le resultat que je souhaiterai obtenir à droite :
Image
https://imgur.com/a/cBMSvCj

j’espère être le plus clair possible, je vous remercie par avance.

Guilhem Freche
Messages : 11
Enregistré le : 01 Avr 2020, 08:45

Re: Moyenner des données selon une condition, avoir les SD et créer un nouveau fichier

Messagepar Guilhem Freche » 27 Juil 2022, 07:59

Bonjour,
ma demande est mal formulée ? Ou alors il faut que je fasse un nouveau post ?
Merci

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Moyenner des données selon une condition, avoir les SD et créer un nouveau fichier

Messagepar Mickael Canouil » 27 Juil 2022, 08:34

Bonjour,

personnellement je ne l'avais pas vu.
Et en général, ici comme ailleurs, si on ajoute un message dans un fil, c'"est pour contribuer à ce fil dans le sens de la question initiale.
Donc, soit c'est vraiment semblable et dans ce cas vous adaptez la réponse présente dans le fil, soit c'est pas le cas et ça devrait toujours être un nouveau message.

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité