首页 > 解决方案 > R中的分组和head(1)并在group_map中保留列表名称

问题描述

(使用 mtcars 进行再现)

第一个问题:为什么下面返回一行而不是每组一行。

library(tidyverse)
mtcars %>%
  group_by(cyl) %>%
  head(1)

第二个问题:我可以这样做,但这里的问题是我的列表的名称(cyl 名称)没有保留,我怎样才能保留它。

mtcars %>%
  group_by(cyl) %>%
  group_map(~head(.x,1))

标签: rdplyrtidyverse

解决方案


head是一个基本 R 函数,它不知道如何尊重dplyr函数完成的分组。有一些dplyr功能可以让你这样做,所以使用它们。

library(dplyr)
mtcars %>% group_by(cyl) %>% slice(1)

#   mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
#2  21       6   160   110  3.9   2.62  16.5     0     1     4     4
#3  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2

要回答您的第二个问题,与基本split dplyr函数不同,请不要给列表命名,以便您稍后分配它们。您可以使用 :

mtcars %>%
  group_by(cyl) %>%
  group_map(~head(.x,1)) %>%
  setNames(unique(sort(mtcars$cyl)))

#$`4`
# A tibble: 1 x 10
#    mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1  22.8   108    93  3.85  2.32  18.6     1     1     4     1

#$`6`
# A tibble: 1 x 10
#    mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1    21   160   110   3.9  2.62  16.5     0     1     4     4

#$`8`
# A tibble: 1 x 10
#    mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1  18.7   360   175  3.15  3.44  17.0     0     0     3     2

推荐阅读