rapply 到 R 中数据框的嵌套列表 [英] rapply to nested list of data frames in R

查看:41
本文介绍了rapply 到 R 中数据框的嵌套列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个嵌套列表,它的基本元素是数据框,我想递归遍历这个列表来对每个数据框进行一些计算,最后得到一个与输入结构相同的结果的嵌套列表.我知道rapply"正是用于此类任务,但我遇到了一个问题,rapply 实际上比我想要的更深入,即它分解每个数据框并应用于每一列(因为数据框本身是一个列表在 R).

i have a nested list whose fundamental element is data frames, and i want to traverse this list recursively to do some computation of each data frame, finally to get a nested list of results in the same structure as the input. I know "rapply" is exactly for such kind of task, but i met a problem that, rapply actually goes even deeper than i want, i.e. it decomposes every data frame and applies to each column instead (because a data frame itself is a list in R).

我能想到的一种解决方法是将每个数据帧转换为矩阵,但它会强制统一数据类型,所以我真的不喜欢它.我想知道是否有任何方法可以控制rapply的递归深度.任何的想法?谢谢.

One workaround i can think about is to convert each data frame to matrix, but it will force to uniform the data types, so i don't like it really. I want to know if there is any way to control the recursive depth of rapply. Any idea? Thanks.

推荐答案

1.包装在原型中

在创建列表结构时,尝试将数据框包装在原型对象中:

When creating your list structure try wrapping the data frames in proto objects:

library(proto)
L <- list(a = proto(DF = BOD), b = proto(DF = BOD))
rapply(L, f = function(.) colSums(.$DF), how = "replace")

给予:

$a
  Time demand 
    22     89 

$b
  Time demand 
    22     89 

如果你想进一步rapply,也将你的函数的结果包装在一个原型对象中;

Wrap the result of your function in a proto object too if you want to further rapply it;

f <- function(.) proto(result = colSums(.$DF))
out <- rapply(L, f = f, how = "replace")
str(out)

给予:

List of 2
 $ a:proto object 
 .. $ result: Named num [1:2] 22 89 
 ..  ..- attr(*, "names")= chr [1:2] "Time" "demand" 
 $ b:proto object 
 .. $ result: Named num [1:2] 22 89 
 ..  ..- attr(*, "names")= chr [1:2] "Time" "demand" 

2.编写自己的饶舌替代方案

recurse <- function (L, f) {
    if (inherits(L, "data.frame")) f(L)
    else lapply(L, recurse, f)
}

L <- list(a = BOD, b = BOD)
recurse(L, colSums)

这给出:

$a
  Time demand 
    22     89 

$b
  Time demand 
    22     89 

添加:第二种方法

这篇关于rapply 到 R 中数据框的嵌套列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆