J'ai une trame de données avec plusieurs colonnes, dont l'une est un facteur appelé "Site". Comment puis-je diviser la structure de données en blocs de lignes avec une valeur unique du "site", puis traiter chaque bloc avec une fonction? Les données ressemblent à ceci: et je souhaite créer un graphique de année code> vs pic code> pour chaque site. P> p>
7 Réponses :
Vous pouvez utiliser iSplit code> (à partir du package "itérateurs") pour créer un objet itérateur qui boucle sur les blocs définis par le site code> Colonne code>: require(foreach)
foreach(site=sites) %dopar% {
pdf(paste(site$key[[1]],".pdf",sep=""))
plot(site$value$year,site$value$peak,main=site$key[[1]])
dev.off()
}
Un autre choix est d'utiliser la fonction ddply code> de la bibliothèque ggplot2 code>. Mais vous mentionnez que vous voulez surtout faire une parcelle de pic contre l'année, vous pouvez également simplement utiliser qplot code>:
Il y a deux fonctions intégrées à traiter avec ces types de situations. ? Agrégats et? par. Dans ce cas parce que vous voulez une parcelle et ne retournez pas de scalaire, utilisez-le par () p>
La sortie dit DATA <- Read.Table ("exemple.txt", en-tête = true) code> p>
par (données [ c ('année', "pic")], Data $ Site, Terrain) Code> P>
null code> car c'est ce que la parcelle retourne. Vous voudrez peut-être définir le périphérique graphique sur PDF pour capturer toute la sortie. P>
Voici ce que je ferais, bien que cela ressemble à vous l'avoir géré par les fonctions de la bibliothèque.
for(i in 1:length(unique(data$site))){
constrainedData = data[data$site==data$site[i]];
doSomething(constrainedData);
}
Karl, je conviens que cela est lisible. Mais le code pour tracer ( DOSMATHIGHT code>) serait beaucoup moins tellement. Bonne solution pour un problème différent, imho.
Je semble me rappeler que cet ancien divisé () code> a une méthode de données.frames, de sorte que divisée (données, données $ SITE) code> produirait une liste de blocs. Vous pouvez ensuite utiliser sur cette liste à l'aide de sapply code> / intitulé code> / pour code>. P>
split () code> est également agréable à cause de nonplit () code>, qui créera un vecteur de la même longueur que les données d'origine et dans le bon ordre. P. >
Il est également très facile de générer vos parcelles avec le package de réseau:
Vous pouvez utiliser la fonction Après cela, les blocs contiennent des données de chaque bloc, que vous pouvez accéder comme autres données.frame: p> et ainsi de suite pour chaque intrigue. P> p> divisée code>
Si vous avez ouvert vos données comme suit: