R - 处理数据帧列表的惯用方法

时间:2010-02-12 19:40:57

标签: r idioms

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

当我尝试对数据进行转换时,这会变得更加痛苦;我无法弄清楚如何将函数应用于列表中存储的每个数据框的特定列。

这里的任何帮助都会非常有帮助。

2 个答案:

答案 0 :(得分:5)

使用所有数据创建一个数据框可能会好得多。例如,在导入(runs[[i]] = data.frame(read.csv(paste("run", i-1, ".csv")), Run=i))时添加运行编号,然后执行alldata <- do.call(rbind, runs)

现在,您可以使用latticeggplot2制作地块。例如,通过运行来获取使用不同颜色的所有运行的散点图:

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

答案 1 :(得分:3)

在处理这样的列表时,最好使用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()

相关问题