2010-02-12 5 views
3

J'ai 30 séries de données, chacune stockée dans un fichier CSV distinct, runi.csv, i = 0:29.R - façon idiomatique de traiter les listes de trames de données

Disons que je veux les rassembler tous dans une liste. La meilleure façon je sais comment faire est

runs = list() 
for (i in 1:30) { runs[[i]] = read.csv(paste("run", i-1, ".csv")); } 

Maintenant, nous allons dire en outre que chacune de ces trames de données stockées dans la liste a les dispositions mêmes de la colonne et que je suis intéressé par la colonne identifiée par « x » et la colonne identifiée par "y".

Quelle est la manière la plus simple de tracer les 30 paires de paires (x, y)? Voici comment je en faire (et je sens qu'il doit être une meilleure façon):

xList = list() 
yList = list() 
for (i in 1:30) { xList[[i]] = runs[[i]]$x; yList[[i]] = runs[[i]]$y; } 
matplot(x=as.data.frame(xList), y=as.data.frame(yList)) 

Cela devient encore plus douloureux quand je suis en train de faire des transformations des données; Je n'arrive pas à comprendre comment appliquer une fonction à une colonne spécifique de chaque trame de données stockée dans une liste.

Toute aide ici serait extrêmement utile.

Répondre

3

Il est probablement préférable d'utiliser une fonction l * ply (à partir de plyr) ou lappliquer lorsque vous traitez des listes comme celle-ci.

La meilleure façon de faire l'importation est probablement comme ceci:

library(plyr) 
runs <- llply(paste("run",1:30,".csv",sep=""), read.csv) 

est ici une façon de les tracer:

# some dummy data 
runs <- list(a=data.frame(x=1:5, y=rnorm(5)), b=data.frame(x=1:5, y=rnorm(5))) 
par(mfrow=c((length(runs)/2),2)); 
l_ply(1:length(runs), function(i) { plot(runs[[i]]$x, runs[[i]]$y) }) 

Bien sûr, vous pouvez également sortir ce à un autre appareil (par exemple pdf) et n'utilisez pas par().

+1

fonctionne <- llply (pâte ("run", 1: 30, "csv", sep = ""), lire. csv) est très lisse - et fonctionne avec lapply si vous ne voulez pas inclure plyr. Bravo – I82Much

5

Vous feriez mieux de créer beaucoup mieux un avec toutes les données. Par exemple, ajoutez le numéro d'exécution lors de l'importation (runs[[i]] = data.frame(read.csv(paste("run", i-1, ".csv")), Run=i)), puis faites alldata <- do.call(rbind, runs).

Vous pouvez maintenant utiliser lattice ou ggplot2 pour créer des graphiques. Par exemple, pour obtenir un diagramme de dispersion de toutes les canalisations en utilisant différentes couleurs par run faire:

library(ggplot2) 
qplot(x, y, colour=Run, data=alldata, geom="point") 
Questions connexes