如何在R中迭代遍历数据框列表

9

我在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中是否有更加规范的方法来实现这一点?


2
+1 for the Q. 不是因为代码量很大,而是因为它完全无法阅读。为了保持理智,必须有比那更好的方法。 - David Heffernan
2
你能提供一些示例数据吗? - Dason
3个回答

10
你可以使用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

3

你能将数据框的列表组合成一个数据框吗?我会使用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)))

1
如果我理解问题正确,这与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

对于列表中所有数据框,按变量给出最小值和最大值。

编辑:代码已经缩短了一点。我假设每个数据框包含相同数量的列并且顺序相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接