R split apply with dplyr - 如何保持切片产生的NA

时间:2016-09-25 23:38:53

标签: r dplyr

mtcars %>% select(mpg, cyl) %>% group_by(cyl) %>% arrange(mpg) %>% slice(8)

输出

    mpg   cyl
  <dbl> <dbl>
1  30.4     4
2  15.2     8

正如您所看到的,它不会产生6个柱面的行 - 即使合并为空,建议保留所有组的方法是什么?

2 个答案:

答案 0 :(得分:2)

要快速从每个组中选择一行,保留NA,您可以在summarise_all内进行分组:

mtcars %>% group_by(cyl) %>% 
    arrange(mpg) %>% 
    summarise_all(funs(.[8]))

## # A tibble: 3 × 11
##     cyl   mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1     4  30.4  75.7    52  4.93 1.615 18.52     1     1     4     2
## 2     6    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
## 3     8  15.2 304.0   150  3.15 3.435 17.30     0     0     3     2

然而,@弗兰克就在上面;它不会很好地扩展到以这种格式子集化到多行,因为summarise要求每个组有一个结果行。要对每个组的第7行和第8行进行子集化,请使用列表列,然后选择tidyr::unnest

library(tidyverse)

mtcars %>% group_by(cyl) %>% 
    arrange(mpg) %>% 
    summarise_all(funs(list(.[7:8]))) %>% 
    unnest()

## # A tibble: 6 × 11
##     cyl   mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1     4  27.3  79.0    66  4.08 1.935 18.90     1     1     4     1
## 2     4  30.4  75.7    52  4.93 1.615 18.52     1     1     4     2
## 3     6  21.4 258.0   110  3.08 3.215 19.44     1     0     3     1
## 4     6    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
## 5     8  15.2 275.8   180  3.07 3.780 18.00     0     0     3     3
## 6     8  15.2 304.0   150  3.15 3.435 17.30     0     0     3     2

purrr::dmap更简洁的版本会返回相同的内容:

mtcars %>% group_by(cyl) %>% 
    arrange(mpg) %>% 
    dmap(~.x[7:8])

答案 1 :(得分:0)

dplyr 0.8 起,我们可以使用group_map,因此与@alistaire一样,我们可以这样做:

library(dplyr)

mtcars2 <- mtcars %>% select(mpg, cyl) %>% group_by(cyl) %>% arrange(mpg)

mtcars2 %>% group_map(~.[8,]) 
#> # A tibble: 3 x 2
#> # Groups:   cyl [3]
#>     cyl   mpg
#>   <dbl> <dbl>
#> 1     4  30.4
#> 2     6  NA  
#> 3     8  15.2

mtcars2 %>% group_map(~.[7:8,]) 
#> # A tibble: 6 x 2
#> # Groups:   cyl [3]
#>     cyl   mpg
#>   <dbl> <dbl>
#> 1     4  27.3
#> 2     4  30.4
#> 3     6  21.4
#> 4     6  NA  
#> 5     8  15.2
#> 6     8  15.2