1

我有一个包含 27 个数据帧的列表,每个帧的行数不同,但列数相同(22)。我需要将每列的最小值、最大值和中值放入每个帧的向量中,结果应如下所示:

frame1 = (c1min, c1max, c1median, c2min, c2max, c2median ... c22min, c22max, c22median)

frame2 = (c1min, c1max, c1median, c2min, c2max, c2median ... c22min, c22max, c22median)

...

frame27 = (c1min, c1max, c1median, c2min, c2max, c2median ... c22min, c22max, c22median)

我已经生成了每列的最小值:

> all_min = lapply(all_list, function(x){apply(x,2,min)})

其中“all_list”是我的列表,“all_min”是列表中所有列分钟的向量。我不确定如何获取向量的编号列表(如上面的示例),以及如何正确格式化它们。有任何想法吗?

编辑:这是其中一个框架的示例:

          lx        ly        lz   ...
1  -0.039256 -0.078644 -0.032388 
2  -0.036041 -0.074536 -0.033906 
3  -0.033898 -0.071544 -0.033906
4

1 回答 1

3

可重现的数据 FTW。

无论如何,这是一个猜测:

lapply( all_list, function(dat) {
   sapply( c(min,max,median), function(fn) apply(dat,2,fn) )
}) 

虽然没有样本数据很难测试。

这通过将函数作为参数传递给 sapply 来实现。对 R 来说“一切都是对象”的众多方式之一。

lapply获取(在本例中为 data.frame)的每个元素,all_list并将其作为第一个参数传递给给定的函数。该函数的第一个参数是dat,因此每次运行该函数时都会调用 data.frame(例如,对于包含在 中的每个 data.frame all_list)。

然后sapply像这样工作,lapply但如果可以的话,会做一些可爱的安排。所以它需要一个函数向量c(min,max,median)并将它们依次分配给函数的第一个参数。该函数的第一个参数是fn,因此每个函数在每次运行时都会被调用。凉爽的。

所以现在我们有了,对于一个all_list被调用的data.framedat和一个被调用的函数fn,一个简单的函数可以完成你最初设定的事情——将汇总函数应用于data.frame的每一列。

最后一步是利用sapply它的魔力返回一个矩阵,其输出形式整洁。然后lapply将该矩阵作为列表的一个元素包含在内,它最终将返回给您。

于 2012-12-10T17:23:13.550 回答