A partir d'un data.frame, je souhaite réaliser soit une suite de subset soit une suite de split afin de créer de nouveaux data.frame ne tenant compte que de certains facteurs. Par exemple :
Code : Tout sélectionner
####Example :
#Delete Environment and clear console
cat("\014")
rm(list=ls())
## Data creation
experimental_plot<-1:10
species<-(c("Wheat","Maiz","Barley","Ray_Grass","Wheat","Maiz","Barley","Ray_Grass","Barley","Ray_Grass") )
variable_plant<-(c("Yield","Impact","Impact","Quality","Yield","Yield","Impact","Impact","Yield","Quality") )
organ<-(c("grain", "entire_plant","grain","entire_plant","straw","grain","straw","grain","grain","entire_plant"))
values_plant<-c(25,3,2,0.55,28,21,3,1,26,0.80)
mydata1<-data.frame(experimental_plot,species,variable_plant,values_plant,organ)
print(mydata1)
experimental_plot species variable_plant values_plant organ
1 1 Wheat Yield 25.00 grain
2 2 Maiz Impact 3.00 entire_plant
3 3 Barley Impact 2.00 grain
4 4 Ray_Grass Quality 0.55 entire_plant
5 5 Wheat Yield 28.00 straw
6 6 Maiz Yield 21.00 grain
7 7 Barley Impact 3.00 straw
8 8 Ray_Grass Impact 1.00 grain
9 9 Barley Yield 26.00 grain
10 10 Ray_Grass Quality 0.80 entire_plant
Je souhaite donc récupérer quatre data.frame, pour chacune des quatre espèces, en conservant les données (rendement, qualité, impact) correspondantes. J'ai deux possibilités, faire un subset ou un split. Ceci étant un exemple, je vais travailler sur une table bien plus grande, je souhaiterais donc automatiser ces subset/split.
J'ai donc tenté ceci :
Code : Tout sélectionner
### Split with a for loop:
mydata_split<-split(mydata,mydata$species)
for (i in 1:n){
print(((paste(all_species[i],"_","data"))))
print(as.data.frame(mydata_split[i]))
}
rm(i)
[1] "Barley _ data"
Barley.experimental_plot Barley.species Barley.variable Barley.values
3 3 Barley Impact 2
7 7 Barley Impact 3
9 9 Barley Yield 26
[1] "Maiz _ data"
Maiz.experimental_plot Maiz.species Maiz.variable Maiz.values
2 2 Maiz Impact 3
6 6 Maiz Yield 21
[1] "Ray_Grass _ data"
Ray_Grass.experimental_plot Ray_Grass.species Ray_Grass.variable
4 4 Ray_Grass Quality
8 8 Ray_Grass Impact
10 10 Ray_Grass Quality
Ray_Grass.values
4 0.55
8 1.00
10 0.80
[1] "Wheat _ data"
Wheat.experimental_plot Wheat.species Wheat.variable Wheat.values
1 1 Wheat Yield 25
5 5 Wheat Yield 28
et ceci :
Code : Tout sélectionner
### Subset with a for loop:
for (i in 1:n){
print(((paste(all_species[i],"_","data"))))
print(subset(mydata,mydata$species==all_species[i]))
}
rm(i)
[1] "Barley _ data"
experimental_plot species variable values
3 3 Barley Impact 2
7 7 Barley Impact 3
9 9 Barley Yield 26
[1] "Maiz _ data"
experimental_plot species variable values
2 2 Maiz Impact 3
6 6 Maiz Yield 21
[1] "Ray_Grass _ data"
experimental_plot species variable values
4 4 Ray_Grass Quality 0.55
8 8 Ray_Grass Impact 1.00
10 10 Ray_Grass Quality 0.80
[1] "Wheat _ data"
experimental_plot species variable values
1 1 Wheat Yield 25
5 5 Wheat Yield 28
Donc les fonctions subset/split fonctionnent, je peux afficher leur résultat tout au long de la boucle. Ce que je souhaiterais, c'est enregistrer ces data.frame comme objet R (et non pas simplement l'afficher comme ici), et que ce qui est affiché avant avec la fonction "paste" soit le nom de cet objet. Mais un code comme celui ci :
Code : Tout sélectionner
for (i in 1:n){
((paste(all_species[i],"_","data")))<-print(subset(mydata,mydata$species==all_species[i]))
}
rm(i)
renvoi sans surprise une erreur :
Error in ((paste(all_species[i], "_", "data"))) <- print(subset(mydata, :
could not find function "(<-"
Quelqu'un saurait-il comment faire ?
Merci d'avance,
Jocelyn