本文介绍了在R中强调数据框的嵌套列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 我有一个嵌套列表,其基本元素是数据帧,我想递归遍历这个列表,对每个数据帧进行一些计算,最后得到与输入结构相同的嵌套列表。我知道饶舌正是为了这样的任务,但我遇到了一个问题,即实际上比我想要的更深,即分解每个数据帧,而不是应用于每一列(因为数据帧本身是一个列表在R)。 我可以想到的一个解决方法是将每个数据帧转换为矩阵,但它会强制统一数据类型,所以我不喜欢它。我想知道是否有任何方法来控制递归的深度。任何想法?谢谢。解决方案 1。在原始中包装 创建列表结构时,尝试在原始对象中包装数据框: library(proto) L rapply(L, f = function(。)colSums(。$ DF),how =replace) 给: $ a 时间需求 22 89 $ b时间需求 22 89 将函数的结果也包含在原型对象中如果你想进一步 rapply 它; f& (。)proto(result = colSums(。$ DF)) out< - rapply(L,f = f,how =replace) str(out) 给出: 列表的2 $ a:proto对象 .. $ result:Named num [1:2] 22 89 .. ..- attr(*,names)= chr [1 :2]时间需求 $ b:proto对象 .. $ result:Named num [1:2] 22 89 .. ..- attr(*,names)= chr [1:2]时间需求 2。写自己的rapply替代 recurse< - function(L,f){ if继承(L,data.frame))f(L) else lapply(L,recurse,f)} L< - list(a = BOD ,b = BOD) recurse(L,colSums) 这给出: $ a 时间需求 22 89 $ b时间要求 22 89 ADDED:第二种方法 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).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. wrap in protoWhen 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")giving:$a Time demand 22 89$b Time demand 22 89Wrap 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)giving: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. write your own rapply alternativerecurse <- function (L, f) { if (inherits(L, "data.frame")) f(L) else lapply(L, recurse, f)}L <- list(a = BOD, b = BOD)recurse(L, colSums)This gives:$a Time demand 22 89$b Time demand 22 89ADDED: second approach 这篇关于在R中强调数据框的嵌套列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 09-09 21:50