rapply到R中的嵌套数据帧列表

foe*_*ehn 7 recursion r list apply dataframe

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

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

G. *_*eck 8

用原型包裹

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

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

赠送:

$a
  Time demand 
    22     89 

$b
  Time demand 
    22     89 
Run Code Online (Sandbox Code Playgroud)

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

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

赠送:

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" 
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

这给出了:

$a
  Time demand 
    22     89 

$b
  Time demand 
    22     89 
Run Code Online (Sandbox Code Playgroud)

增加:第二种方法

  • 我将解决方案2更改为:`recurse < - function(L,f){if(inherits(L,"data.frame"))f(L)else if(!is.list(L)&& length(L)= = 1)f(L)否则lapply(L,recurse,f)}`使它更健壮.当非data.frame在您的输入中结束时,它应该阻止无限递归. (2认同)