【问题标题】:Apply function at different levels of a tibble在 tibble 的不同级别应用函数
【发布时间】:2018-09-12 19:21:31
【问题描述】:

我有以下小标题:

library(tidyverse)

set.seed(1234)

df <- tibble(
  x1 = letters[1:2],
  y1 = list(
    tibble(
      x2 = letters[3:4],
      y2 = list(
        tibble(
          x3 = seq(1, 100, 1),
          y3 = rnorm(100)
        )
        )
      )
    )
)

我需要访问包含x3y3 的tibble 内的tibble,并将自定义函数应用于每个数据框。为简单起见,假设我需要将base::mean() 应用到y3

我的真实数据比这大得多,所以我正在寻找一种干净有效的方法来做这件事。有什么想法吗?

【问题讨论】:

    标签: r tidyverse purrr tibble


    【解决方案1】:

    你能把你的方法拆下来吗?

     df %>% unnest() %>% unnest() %>% 
       group_by(x2) %>% 
       summarise(mean(y3))
    
    # A tibble: 2 x 2
      x2    `mean(y3)`
      <chr>      <dbl>
    1 c         -0.157
    2 d         -0.157
    

    不确定您希望最终数据框的外观如何,但这里有另一个建议

     df %>% unnest() %>% 
       mutate(y3.average = map(y2, ~mean(.$y3)) ) %>% 
       unnest(y3.average)
    
    # A tibble: 4 x 4
      x1    x2    y2                 y3.average
      <chr> <chr> <list>                  <dbl>
    1 a     c     <tibble [100 × 2]>     -0.157
    2 a     d     <tibble [100 × 2]>     -0.157
    3 b     c     <tibble [100 × 2]>     -0.157
    4 b     d     <tibble [100 × 2]>     -0.157
    

    【讨论】:

      【解决方案2】:

      您需要找到要应用该函数的级别(我通过括号索引来完成),然后应用该函数。我希望这可以转移到您需要做的事情上。

      > df[["y1"]][[1]][[2]] %>% lapply(., function(x){mean(x$y3)})
      
      [[1]]
      [1] 0.04124318
      
      [[2]]
      [1] 0.04124318
      

      【讨论】:

      • 使用提供的数据,我无法复制您提供的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 2022-01-19
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      相关资源
      最近更新 更多