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
))