mtcars %>% select(mpg, cyl) %>% group_by(cyl) %>% arrange(mpg) %>% slice(8)
输出
mpg cyl
<dbl> <dbl>
1 30.4 4
2 15.2 8
如您所见,它没有为6个汽缸产生一行——保持所有组的推荐方法是什么,即使合并为空也是如此?
为了快速选择每个组的一行,保留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
然而,正如@Frank所说,在这种格式下,它不会很好地扩展到子集多行,因为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])
dmap
has now moved to package purrrlyr
- moodymudskipper自从 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
mtcars %>% select(mpg, cyl) %>% group_by(cyl) %>% arrange(mpg) %>% summarise(mpg = mpg[8])
是可行的。 - alistaireslice
的设计与 R 中其他地方的[]
表现不同。Alistaire 的解决方案还可以,直到你有更多列要处理时,此时你可能想切换到 data.table,使用类似DT[order(mpg), .SD[8L], by=cyl, .SDcols="mpg"]
的语法... 好吧,我猜还有 summarise_each/summarise_at,但这些方法无法扩展到例如选择第七和第八行的情况。 - Franksummarise_all
轻松地进行泛化,例如:mtcars %>% select(mpg, cyl) %>% group_by(cyl) %>% arrange(mpg) %>% summarise_all(funs(.[8]))
。 - alistaire