代码之家  ›  专栏  ›  技术社区  ›  Ratnanil

使用嵌套数据帧访问purrr::map()中的分组变量

  •  1
  • Ratnanil  · 技术社区  · 7 年前

    我正在使用 tidyr::nest() 结合 purrr::map() (-家庭)至a组 data.frame 分组,然后对每个子集做一些有趣的事情。考虑下面的例子, 请忽略我不需要的事实 nest() map() 这样做 (这是一个过于简单的例子):

    library(dplyr)
    library(purrr)
    library(tidyr)
    
    mtcars %>% 
      group_by(cyl) %>%
      nest() %>%
      mutate(
        wt_mean = map_dbl(data,~mean(.x$wt))
      )
    
    # A tibble: 8 x 4
        cyl  gear data               cly2
      <dbl> <dbl> <list>            <dbl>
    1     6     4 <tibble [4 x 9]>      6
    2     4     4 <tibble [8 x 9]>      4
    3     6     3 <tibble [2 x 9]>      6
    4     8     3 <tibble [12 x 9]>     8
    5     4     3 <tibble [1 x 9]>      4
    6     4     5 <tibble [2 x 9]>      4
    7     8     5 <tibble [2 x 9]>      8
    8     6     5 <tibble [1 x 9]>      6
    

    通常,当我执行这种类型的操作时,我需要访问分组变量( cyl 在这种情况下)在 . 但是,这些分组变量显示为向量,其长度与嵌套数据帧中的行数相对应,因此不容易借出它们自己。

    有没有办法运行以下操作?我想知道 wt 共青团 )

    mtcars %>% 
      group_by(cyl,gear) %>%
      nest() %>%
      mutate(
        wt_mean = map_dbl(data,~mean(.x$wt)/cyl)
      )
    
    
    Error in mutate_impl(.data, dots) : 
      Evaluation error: Result 1 is not a length 1 atomic vector.
    
    1 回复  |  直到 7 年前
        1
  •  6
  •   zack    7 年前

    cyl 出局 map 电话:

    mtcars %>% 
      group_by(cyl,gear) %>%
      nest() %>%
      mutate(
        wt_mean = map_dbl(data, ~mean(.x$wt)) / cyl
      )
    
    # A tibble: 8 x 4
        cyl  gear data              wt_mean
      <dbl> <dbl> <list>              <dbl>
    1     6     4 <tibble [4 x 9]>    0.516
    2     4     4 <tibble [8 x 9]>    0.595
    3     6     3 <tibble [2 x 9]>    0.556
    4     8     3 <tibble [12 x 9]>   0.513
    5     4     3 <tibble [1 x 9]>    0.616
    6     4     5 <tibble [2 x 9]>    0.457
    7     8     5 <tibble [2 x 9]>    0.421
    8     6     5 <tibble [1 x 9]>    0.462
    

    map_dbl 看到 共青团 作为长度为8的向量,因为 nest 从中删除组 data.frame . 使用 共青团 在里面 map_* 函数调用(如OP示例中所示)产生8个长度为8的向量。

    2其他办法:

    两者的结果与上面相同,但将分组的变量保留在 地图_*

    mtcars %>% 
      group_by(cyl,gear) %>%
      nest() %>%
      group_by(cyl, gear) %>%
      mutate(wt_mean = map_dbl(data,~mean(.x$wt)/cyl))
    

    map2 用于迭代 共青团

    mtcars %>% 
      group_by(cyl,gear) %>%
      nest() %>%
      mutate(wt_mean = map2_dbl(data, cyl,~mean(.x$wt)/ .y))
    
        2
  •  3
  •   Ratnanil    7 年前

    在新发布的 dplyr 0-8-0 ,您现在可以使用 group_map ,我发现它对于这个用例非常方便。这是 the example

    library(dplyr, warn.conflicts = FALSE)
    
    mtcars %>% 
      group_by(cyl) %>%
      group_map(function(data, group_info) {
        tibble::tibble(wt_mean = mean(data$wt) / group_info$cyl)
      })