大多数数据操作都是在变量定义的组上完成的。 group_by()
获取现有表并将其转换为分组表,在其中执行操作"by group"。 ungroup()
删除分组。
参数
- .data
-
数据帧、数据帧扩展(例如 tibble)或惰性数据帧(例如来自 dbplyr 或 dtplyr)。有关更多详细信息,请参阅下面的方法。
- ...
-
在
group_by()
中,用于分组的变量或计算。计算始终在未分组的数据帧上完成。要对分组数据执行计算,您需要在group_by()
之前使用单独的mutate()
步骤。nest_by()
中不允许进行计算。在ungroup()
中,要从分组中删除的变量。 - .add
-
当
FALSE
时,默认情况下,group_by()
将覆盖现有组。要添加到现有组,请使用.add = TRUE
。该参数以前称为
add
,但这阻止了创建名为add
的新分组变量,并且与我们的命名约定冲突。 - .drop
-
删除由数据中未出现的因子水平形成的组?默认值为
TRUE
,除非.data
之前已与.drop = FALSE
分组。有关详细信息,请参阅group_by_drop_default()
。 - x
值
具有类 grouped_df
的分组 DataFrame ,除非 ...
和 add
的组合产生一组空的分组列,在这种情况下将返回 tibble。
方法
这些函数是泛型函数,这意味着包可以为其他类提供实现(方法)。有关额外参数和行为差异,请参阅各个方法的文档。
当前加载的包中可用的方法:
-
group_by()
:dbplyr(tbl_lazy
)、dplyr(data.frame
)。 -
ungroup()
:dbplyr(tbl_lazy
)、dplyr(data.frame
、grouped_df
、rowwise_df
)。
排序
目前,group_by()
在内部按升序对组进行排序。这会导致聚合组的函数产生有序输出,例如 summarise()
。
当用作分组列时,字符向量在 C 语言环境中进行排序,以提高 R 会话之间的性能和可重复性。如果分组操作的结果顺序很重要并且取决于区域设置,则您应该通过显式调用 arrange()
来跟踪分组操作并设置 .locale
参数。例如:
data %>%
group_by(chr) %>%
summarise(avg = mean(x)) %>%
arrange(chr, .locale = "en")
这通常可以作为生成供人类使用的内容(例如 HTML 表格)之前的预备步骤。
遗留行为
在 dplyr 1.1.0 之前,字符向量分组列在系统区域设置中进行排序。如果您需要暂时恢复此行为,可以将全局选项 dplyr.legacy_locale
设置为 TRUE
,但应谨慎使用,并且您应该期望在 dplyr 的未来版本中删除此选项。最好更新现有代码以显式调用arrange(.locale = )
。请注意,设置 dplyr.legacy_locale
还将强制调用 arrange()
以使用系统区域设置。
也可以看看
其他分组函数:group_map()
、group_nest()
、group_split()
、group_trim()
例子
by_cyl <- mtcars %>% group_by(cyl)
# grouping doesn't change how the data looks (apart from listing
# how it's grouped):
by_cyl
#> # A tibble: 32 × 11
#> # Groups: cyl [3]
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
#> 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
#> 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
#> 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
#> 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
#> 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
#> 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
#> 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
#> 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
#> 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
#> # ℹ 22 more rows
# It changes how it acts with the other dplyr verbs:
by_cyl %>% summarise(
disp = mean(disp),
hp = mean(hp)
)
#> # A tibble: 3 × 3
#> cyl disp hp
#> <dbl> <dbl> <dbl>
#> 1 4 105. 82.6
#> 2 6 183. 122.
#> 3 8 353. 209.
by_cyl %>% filter(disp == max(disp))
#> # A tibble: 3 × 11
#> # Groups: cyl [3]
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
#> 2 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
#> 3 10.4 8 472 205 2.93 5.25 18.0 0 0 3 4
# Each call to summarise() removes a layer of grouping
by_vs_am <- mtcars %>% group_by(vs, am)
by_vs <- by_vs_am %>% summarise(n = n())
#> `summarise()` has grouped output by 'vs'. You can override using the
#> `.groups` argument.
by_vs
#> # A tibble: 4 × 3
#> # Groups: vs [2]
#> vs am n
#> <dbl> <dbl> <int>
#> 1 0 0 12
#> 2 0 1 6
#> 3 1 0 7
#> 4 1 1 7
by_vs %>% summarise(n = sum(n))
#> # A tibble: 2 × 2
#> vs n
#> <dbl> <int>
#> 1 0 18
#> 2 1 14
# To removing grouping, use ungroup
by_vs %>%
ungroup() %>%
summarise(n = sum(n))
#> # A tibble: 1 × 1
#> n
#> <int>
#> 1 32
# By default, group_by() overrides existing grouping
by_cyl %>%
group_by(vs, am) %>%
group_vars()
#> [1] "vs" "am"
# Use add = TRUE to instead append
by_cyl %>%
group_by(vs, am, .add = TRUE) %>%
group_vars()
#> [1] "cyl" "vs" "am"
# You can group by expressions: this is a short-hand
# for a mutate() followed by a group_by()
mtcars %>%
group_by(vsam = vs + am)
#> # A tibble: 32 × 12
#> # Groups: vsam [3]
#> mpg cyl disp hp drat wt qsec vs am gear carb vsam
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4 1
#> 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4 1
#> 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1 2
#> 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1 1
#> 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2 0
#> 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1 1
#> 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4 0
#> 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2 1
#> 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2 1
#> 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4 1
#> # ℹ 22 more rows
# The implicit mutate() step is always performed on the
# ungrouped data. Here we get 3 groups:
mtcars %>%
group_by(vs) %>%
group_by(hp_cut = cut(hp, 3))
#> # A tibble: 32 × 12
#> # Groups: hp_cut [3]
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
#> 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
#> 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
#> 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
#> 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
#> 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
#> 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
#> 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
#> 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
#> 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
#> # ℹ 22 more rows
#> # ℹ 1 more variable: hp_cut <fct>
# If you want it to be performed by groups,
# you have to use an explicit mutate() call.
# Here we get 3 groups per value of vs
mtcars %>%
group_by(vs) %>%
mutate(hp_cut = cut(hp, 3)) %>%
group_by(hp_cut)
#> # A tibble: 32 × 12
#> # Groups: hp_cut [6]
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
#> 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
#> 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
#> 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
#> 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
#> 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
#> 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
#> 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
#> 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
#> 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
#> # ℹ 22 more rows
#> # ℹ 1 more variable: hp_cut <fct>
# when factors are involved and .drop = FALSE, groups can be empty
tbl <- tibble(
x = 1:10,
y = factor(rep(c("a", "c"), each = 5), levels = c("a", "b", "c"))
)
tbl %>%
group_by(y, .drop = FALSE) %>%
group_rows()
#> <list_of<integer>[3]>
#> [[1]]
#> [1] 1 2 3 4 5
#>
#> [[2]]
#> integer(0)
#>
#> [[3]]
#> [1] 6 7 8 9 10
#>
相关用法
- R dplyr group_by_all 按选择的变量进行分组
- R dplyr group_by_drop_default group_by 的 .drop 参数的默认值
- R dplyr group_trim 修剪分组结构
- R dplyr group_split 按组分割 DataFrame
- R dplyr group_map 对每个组应用一个函数
- R dplyr group_nest 使用分组规范嵌套 tibble
- R dplyr group_data 元数据分组
- R dplyr group_cols 选择分组变量
- R dplyr slice 使用行的位置对行进行子集化
- R dplyr copy_to 将本地数据帧复制到远程src
- R dplyr sample_n 从表中采样 n 行
- R dplyr consecutive_id 为连续组合生成唯一标识符
- R dplyr row_number 整数排名函数
- R dplyr band_members 乐队成员
- R dplyr mutate-joins 变异连接
- R dplyr nth 从向量中提取第一个、最后一个或第 n 个值
- R dplyr coalesce 找到第一个非缺失元素
- R dplyr mutate 创建、修改和删除列
- R dplyr order_by 用于排序窗口函数输出的辅助函数
- R dplyr context 有关“当前”组或变量的信息
- R dplyr percent_rank 比例排名函数
- R dplyr recode 重新编码值
- R dplyr starwars 星球大战人物
- R dplyr desc 降序
- R dplyr between 检测值落在指定范围内的位置
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Group by one or more variables。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。