【问题标题】:How to iterate over a list of data-frames in R如何迭代R中的数据框列表
【发布时间】:2011-02-19 20:05:41
【问题描述】:

我在 R 中有一个包含多个数据框的列表。我想遍历数据帧并计算数据帧中值的最小值/最大值。这是我现在拥有的代码:

firstname = names(dats)[1]
xlim = c( min( dats[[firstname]][,xlab] ), max( dats[[firstname]][,xlab] ) )
for ( name in names(dats) ) {
   xlim = c( min(xlim[1],dats[[name]][,xlab]), max(xlim[2],dats[[name]][,xlab]) )
} 

这对我来说似乎很难看,因为它需要大量代码来做一些非常简单的事情。在 R 中有没有更规范的方法来做到这一点?

【问题讨论】:

  • +1 表示 Q。与其说代码很多,不如说它完全不可读。为了理智,必须有比这更好的方法。
  • 您能提供一些示例数据吗?

标签: r coding-style dataframe


【解决方案1】:

您可以使用lapply 从所有数据框中提取xlab 列,并使用unlist 组合成一个向量,然后取minmax

xlab <- 'a'
dats <- list( df1 = data.frame(a=sample(1:3), b = sample(11:13)),
              df2 = data.frame(a=sample(1:3), b = sample(11:13)))

>  min( unlist( lapply( dats, '[', xlab ) ) )
[1] 1
>  max( unlist( lapply( dats, '[', xlab ) ) )
[1] 3

【讨论】:

    【解决方案2】:

    您可以将数据框列表中的数据框合并为一个数据框吗?我会使用plyr 包和rbind.fill,只要感兴趣的列在所有数据帧中的名称相同,这将允许数据帧具有不匹配的列。

    library(plyr)
    df.orig <- data.frame(one = rep(1:4, each = 4), two = 1:16)
    df.list <- dlply(df.orig, "one")
    df.new <- rbind.fill(df.list)
    xlim <- with(df.new, c(min(two), max(two)))
    

    【讨论】:

      【解决方案3】:

      如果我正确理解了这个问题,这与 plyr 有关:

      dats <- list( df1 = data.frame(a=sample(1:3), b = sample(11:13)),
                    df2 = data.frame(a=sample(1:3), b = sample(11:13)))
      
      library(plyr)
      
      xlim <- adply(do.call("rbind",dats),2,function(x)c(min(x),max(x)))
          names(xlim)=c("xlab","min","max")
      
      xlim
        xlab min max
      1    a   1   3
      2    b  11  13
      

      为每个变量提供列表中所有数据框折叠的最小值和最大值。

      编辑:缩短了代码。我确实假设每个数据帧都包含相同数量的相同顺序的列。

      【讨论】:

        猜你喜欢
        • 2021-07-10
        • 2019-07-05
        • 1970-01-01
        • 2021-07-20
        • 1970-01-01
        • 1970-01-01
        • 2020-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多