【问题标题】:R - idiomatic way to deal with lists of data framesR - 处理数据帧列表的惯用方式
【发布时间】:2010-02-12 19:40:56
【问题描述】:

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

当我尝试对数据进行转换时,这会变得更加痛苦;我不知道如何将函数应用于存储在列表中的每个数据帧的特定列。

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

【问题讨论】:

    标签: r idioms


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案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()

      【讨论】:

      • runs
      猜你喜欢
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 2013-06-15
      • 1970-01-01
      • 2011-04-21
      • 2017-06-27
      • 2014-12-08
      相关资源
      最近更新 更多