R - идиоматический способ работы со списками фреймов данных

У меня есть 30 прогонов данных, каждый из которых хранится в отдельном файле CSV, runi.csv, i = 0:29.

Допустим, я хочу собрать их все в список. Лучший способ, которым я знаю, как это сделать, это

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

Теперь давайте дополнительно скажем, что каждый из этих фреймов данных, хранящихся в списке, имеет одинаковые макеты столбцов, и что меня интересует столбец, обозначенный «x», и столбец, обозначенный «y».

Каков самый простой способ построить все 30 пар (x, y)? Вот как я бы это сделал в настоящее время (и я чувствую, что должен быть лучший способ):

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

Это становится еще более болезненным, когда я пытаюсь преобразовать данные; Я не могу понять, как применить функцию к определенному столбцу каждого фрейма данных, хранящегося в списке.

Любая помощь здесь будет чрезвычайно полезной.


person I82Much    schedule 12.02.2010    source источник


Ответы (2)


Вероятно, лучше всего использовать функцию l*ply (из plyr) или lapply при работе с подобными списками.

Самый простой способ сделать импорт, вероятно, выглядит так:

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

Вот один из способов их построения:

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

Конечно, вы также можете вывести это на другое устройство (например, в pdf) и не использовать par().

person Shane    schedule 12.02.2010
comment
run ‹- llply(paste(run,1:30,.csv,sep=), read.csv) очень удобен и работает с lapply, если вы не хотите включать plyr. Браво - person I82Much; 13.02.2010

Вероятно, было бы гораздо лучше создать один фрейм данных со всеми данными. Например, добавьте номер запуска при импорте (runs[[i]] = data.frame(read.csv(paste("run", i-1, ".csv")), Run=i)), а затем выполните alldata <- do.call(rbind, runs).

Теперь вы можете использовать lattice или ggplot2 для создания графиков. Например, чтобы получить диаграмму рассеивания всех запусков с использованием разных цветов, выполните:

library(ggplot2)
qplot(x, y, colour=Run, data=alldata, geom="point")
person Aniko    schedule 12.02.2010