10
votes

Comment diviser une trame de données par des lignes, puis traiter les blocs?

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: xxx

et je souhaite créer un graphique de année vs pic pour chaque site.


0 commentaires

7 Réponses :


14
votes

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


0 commentaires

12
votes

Un autre choix est d'utiliser la fonction ddply de la bibliothèque ggplot2 . Mais vous mentionnez que vous voulez surtout faire une parcelle de pic contre l'année, vous pouvez également simplement utiliser qplot : xxx

 text alt

D'autre part, je ressemble à la solution de David Smith qui permet d'exécuter la fonction de fonctionner sur plusieurs processeurs.


0 commentaires

4
votes

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

DATA <- Read.Table ("exemple.txt", en-tête = true)

par (données [ c ('année', "pic")], Data $ Site, Terrain)

La sortie dit null 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.


0 commentaires

6
votes

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


1 commentaires

Karl, je conviens que cela est lisible. Mais le code pour tracer ( DOSMATHIGHT ) serait beaucoup moins tellement. Bonne solution pour un problème différent, imho.



10
votes

Je semble me rappeler que cet ancien divisé () a une méthode de données.frames, de sorte que divisée (données, données $ SITE) produirait une liste de blocs. Vous pouvez ensuite utiliser sur cette liste à l'aide de sapply / intitulé / pour .

split () est également agréable à cause de nonplit () , qui créera un vecteur de la même longueur que les données d'origine et dans le bon ordre.


0 commentaires

2
votes

Il est également très facile de générer vos parcelles avec le package de réseau: xxx


0 commentaires

0
votes

Vous pouvez utiliser la fonction divisée Si vous avez ouvert vos données comme suit: xxx

Après cela, les blocs contiennent des données de chaque bloc, que vous pouvez accéder comme autres données.frame: xxx

et ainsi de suite pour chaque intrigue.


0 commentaires