首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我将如何编写purrr::purrr的递归版本?

我将如何编写purrr::purrr的递归版本?
EN

Stack Overflow用户
提问于 2018-01-03 18:03:32
回答 1查看 254关注 0票数 5

假设我有一个嵌套列表,其中包含一组不同级别的数据帧。我只想提取数据帧的扁平列表。我如何使用purrr函数来编写它呢?我应该看看reduce

例如,给定数据:

代码语言:javascript
复制
s <- list(x = 1:10,
          data = data.frame(report = LETTERS[1:5],
                            value = rnorm(5, 20, 5)),
          report = list(A = data.frame(x = 1:3, y = c(2, 4, 6)),
                        B = data.frame(x = 1:3, y = c(3, 6, 9)),
                        z = 4:10,
                        other = data.frame(w = 3:5,
                                       color = c("red", "green", "blue"))))

我想要函数返回:

代码语言:javascript
复制
list(data = data.frame(report = LETTERS[1:5],
                       value = rnorm(5, 20, 5)),
     `report$A` = data.frame(x = 1:3, y = c(2, 4, 6)),
     `report$B` = data.frame(x = 1:3, y = c(3, 6, 9)),
     `report$other` = data.frame(w = 3:5,
                                 color = c("red", "green", "blue")))

我编写了一个递归函数:

代码语言:javascript
复制
recursive_keep <- function(.x, .f) {
  loop <- function(.y) {
    if(is.list(.y)) {
      c(keep(.y, .f), flatten(map(discard(.y, .f), loop)))
    } else if(.f(.y)) {
      .y
    } else {
      NULL
    }
  }
  loop(.x)
}

它可以称为:

代码语言:javascript
复制
recursive_keep(s, is.data.frame)

在这个示例中,它似乎有效,但它不保留名称信息。我希望保存足够的信息,以便从原始对象中提取数据。也许这是一个更容易回答的问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-03 21:57:11

这个带有一行体的递归函数保留名称,并且不使用包:

代码语言:javascript
复制
rec <- function(x, FUN = is.data.frame)
  if (FUN(x)) list(x) else if (is.list(x)) do.call("c", lapply(x, rec, FUN))

str(rec(s))  # test

给予(产出后继续):

代码语言:javascript
复制
List of 4
 $ data        :'data.frame':   5 obs. of  2 variables:
  ..$ report: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
  ..$ value : num [1:5] 29.1 19.9 21.2 13 25.2
 $ report.A    :'data.frame':   3 obs. of  2 variables:
  ..$ x: int [1:3] 1 2 3
  ..$ y: num [1:3] 2 4 6
 $ report.B    :'data.frame':   3 obs. of  2 variables:
  ..$ x: int [1:3] 1 2 3
  ..$ y: num [1:3] 3 6 9
 $ report.other:'data.frame':   3 obs. of  2 variables:
  ..$ w    : int [1:3] 3 4 5
  ..$ color: Factor w/ 3 levels "blue","green",..: 3 2 1

关于从原始对象Areport内部获取(比方说) s

代码语言:javascript
复制
s[["report"]][["A"]]

代码语言:javascript
复制
ix <- c("report", "A")
s[[ix]]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48082797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档