R - идиоматический способ работы со списками фреймов данных - PullRequest
3 голосов
/ 12 февраля 2010

У меня 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».

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 12 февраля 2010

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

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

library(ggplot2)
qplot(x, y, colour=Run, data=alldata, geom="point")
3 голосов
/ 12 февраля 2010

Вероятно, лучше всего использовать функцию 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().

...