首页 文章

使用purrr映射dplyr :: select

提问于
浏览
3

我有一个数据框,其中包含一堆嵌套的数据框,我想将dplyr :: select应用于每个嵌套数据框 . 这是一个例子

library(tidyverse)

 mtcars %>%
 group_by(cyl) %>%
 nest %>%
 mutate(data2 = ~map(data, dplyr::select(.,-mpg)))

我认为这会产生一个包含三列的数据框 . cyl :柱面数 data :嵌套数据 data2 :与数据相同,但每个元素都没有mpg列 .

相反,R崩溃:

抓到了段落
地址0x7ffc1e445000,导致'内存未映射'

追溯:
1:.Call(_dplyr_mutate_impl,df,dots)
2:mutate_impl(.data,dots)
3:mutate.tbl_df( . ,data2 = ~map(data,dplyr :: select( . , - mpg)))
4:mutate( . ,data2 = ~map(data,dplyr :: select( . , - mpg)))
5:function_list [[k]](value)
6:withVisible(function_list [[k]](value))
7:freduce(value,_ function_list
8:_fseq_lhs
9:eval(quote(_fseq_lhs)),env,env)
10:eval(quote(_fseq_lhs)),env,env)
11:withVisible(eval(quote(_fseq_lhs)),env,env))
12:mtcars%>%group_by(cyl)%>%nest%>%mutate(data2 = ~map(data,dplyr :: select( . , - mpg)))

可能的行动:
1:中止(使用核心转储,如果启用)
2:正常R退出
3:退出R而不保存工作区
4:退出R保存工作区

我意识到如果我在嵌套之前应用选择操作,我可以获得我想要的列,但这与我真正的问题不太相似 . 有人可以向我解释我在这里做错了什么吗?谢谢你的建议 .

2 回答

  • 3

    你需要将 ~map 移到 select ;或者将评论用作@Russ;函数(在本例中为 purrr::map )接受公式作为参数时使用 ~

    mtcars %>%
        group_by(cyl) %>%
        nest %>%
        mutate(data2 = map(data, ~ select(., -mpg)))
    
    # A tibble: 3 x 3
    #    cyl data               data2            
    #  <dbl> <list>             <list>           
    #1     6 <tibble [7 × 10]>  <tibble [7 × 9]> 
    #2     4 <tibble [11 × 10]> <tibble [11 × 9]>
    #3     8 <tibble [14 × 10]> <tibble [14 × 9]>
    
  • 1

    这里有两种方式:一种是跳过嵌套,只使用 do ,一种是嵌套,然后使用 map . unnest(data2) 然后将其恢复为常规数据框 . 需要注意的一点是,我在第一个例子中的 select 中包含了 -cyl ;这是因为否则,你最终得到 cyl 两次,一次来自分组列,一次是来自未建模的数据框 .

    除了个人偏好之外,我不确定其中一种方法是否优于另一种方式 .

    library(tidyverse)
    
    mtcars %>%
        group_by(cyl) %>%
        do(data2 = select(., -mpg, -cyl)) %>%
        unnest(data2)
    #> # A tibble: 32 x 10
    #>      cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
    #>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    #>  1     4 108      93  3.85  2.32  18.6     1     1     4     1
    #>  2     4 147.     62  3.69  3.19  20       1     0     4     2
    #>  3     4 141.     95  3.92  3.15  22.9     1     0     4     2
    #>  4     4  78.7    66  4.08  2.2   19.5     1     1     4     1
    #>  5     4  75.7    52  4.93  1.62  18.5     1     1     4     2
    #>  6     4  71.1    65  4.22  1.84  19.9     1     1     4     1
    #>  7     4 120.     97  3.7   2.46  20.0     1     0     3     1
    #>  8     4  79      66  4.08  1.94  18.9     1     1     4     1
    #>  9     4 120.     91  4.43  2.14  16.7     0     1     5     2
    #> 10     4  95.1   113  3.77  1.51  16.9     1     1     5     2
    #> # ... with 22 more rows
    
    mtcars %>%
        group_by(cyl) %>%
        nest() %>%
        mutate(data2 = map(data, function(df) select(df, -mpg))) %>%
        unnest(data2)
    #> # A tibble: 32 x 10
    #>      cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
    #>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    #>  1     6  160    110  3.9   2.62  16.5     0     1     4     4
    #>  2     6  160    110  3.9   2.88  17.0     0     1     4     4
    #>  3     6  258    110  3.08  3.22  19.4     1     0     3     1
    #>  4     6  225    105  2.76  3.46  20.2     1     0     3     1
    #>  5     6  168.   123  3.92  3.44  18.3     1     0     4     4
    #>  6     6  168.   123  3.92  3.44  18.9     1     0     4     4
    #>  7     6  145    175  3.62  2.77  15.5     0     1     5     6
    #>  8     4  108     93  3.85  2.32  18.6     1     1     4     1
    #>  9     4  147.    62  3.69  3.19  20       1     0     4     2
    #> 10     4  141.    95  3.92  3.15  22.9     1     0     4     2
    #> # ... with 22 more rows
    

    reprex package(v0.2.0)创建于2018-05-11 .

相关问题