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

Ser*_*hov 6 r dplyr

mtcars %>% select(mpg, cyl) %>% group_by(cyl) %>% arrange(mpg) %>% slice(8)
Run Code Online (Sandbox Code Playgroud)

输出

    mpg   cyl
  <dbl> <dbl>
1  30.4     4
2  15.2     8
Run Code Online (Sandbox Code Playgroud)

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

ali*_*ire 3

要快速从每个组中选择一行,保留NAs,您可以在 内进行子集化summarise_all

\n\n
mtcars %>% group_by(cyl) %>% \n    arrange(mpg) %>% \n    summarise_all(funs(.[8]))\n\n## # A tibble: 3 \xc3\x97 11\n##     cyl   mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb\n##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>\n## 1     4  30.4  75.7    52  4.93 1.615 18.52     1     1     4     2\n## 2     6    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA\n## 3     8  15.2 304.0   150  3.15 3.435 17.30     0     0     3     2\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,@Frank 就在上面;它不能很好地扩展到这种格式的多行子集,因为summarise每个组需要一个结果行。要对每个组的第 7 行和第 8 行进行子集化,请使用列表列并取消嵌套tidyr::unnest

\n\n
library(tidyverse)\n\nmtcars %>% group_by(cyl) %>% \n    arrange(mpg) %>% \n    summarise_all(funs(list(.[7:8]))) %>% \n    unnest()\n\n## # A tibble: 6 \xc3\x97 11\n##     cyl   mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb\n##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>\n## 1     4  27.3  79.0    66  4.08 1.935 18.90     1     1     4     1\n## 2     4  30.4  75.7    52  4.93 1.615 18.52     1     1     4     2\n## 3     6  21.4 258.0   110  3.08 3.215 19.44     1     0     3     1\n## 4     6    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA\n## 5     8  15.2 275.8   180  3.07 3.780 18.00     0     0     3     3\n## 6     8  15.2 304.0   150  3.15 3.435 17.30     0     0     3     2\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
mtcars %>% group_by(cyl) %>% \n    arrange(mpg) %>% \n    dmap(~.x[7:8])\n
Run Code Online (Sandbox Code Playgroud)\n