如何按 dplyr 中除一列之外的所有列进行分组


您可以使用 R 中的dplyr包,使用以下基本语法对数据框中除一列之外的所有列进行分组:

 df %>%
  group_by(across(c( - this_column)))

此特定示例按除名为this_column的列之外的所有列对数据框进行分组。

请注意,公式中的负号 ( ) 告诉 dplyr 在group_by()函数中排除该特定列。

以下示例展示了如何在实践中使用此语法。

示例:按 dplyr 中除一列之外的所有列进行分组

假设我们在 R 中有以下数据框,其中包含有关各种篮球运动员的信息:

 #create data frame
df <- data. frame (team=c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'),
                 position=c('G', 'G', 'F', 'F', 'G', 'G', 'F', 'F'),
                 starter=c('Y', 'Y', 'Y', 'N', 'Y', 'N', 'N', 'N'),
                 dots=c(99, 104, 119, 113))

#view data frame
df

  team position starter points
1 AGY 99
2 AGY 104
3 AFY 119
4 AFN 113
5 BGY 99
6 BGN 104
7 BFN 119
8 BFN 113

现在假设我们想要找到列中的最大值,该列在数据框中的所有其他列中分组。

我们可以使用以下语法来做到这一点:

 library (dplyr)

#group by all columns except points column and find max points
df %>%
  group_by(across(c( - points))) %>%
  mutate(max_points = max(points))

# A tibble: 8 x 5
# Groups: team, position, starter [6]
  team position starter points max_points
                 
1 AGY 99 104
2 AGY 104 104
3 AFY 119 119
4 AFN 113 113
5 BGY 99 99
6 BGN 104 104
7 BFN 119 119
8 BFN 113 119

从结果我们可以看出:

  • 队伍值为 A、位置值为 G、起始值为 Y 的所有玩家的最大分值为104
  • 所有队伍值为 A、位置值为 F、起始值为 Y 的玩家的最大分值是119
  • 所有球队值为 A、位置值为 F、起始值为 N 的球员的最大分值是113

等等。

请注意,如果我们在group_by()函数中输入除之外的所有列名称,也可以获得相同的结果:

 library (dplyr)

#group by all columns except points column and find max points
df %>%
  group_by(across(c(team, position, starter))) %>%
  mutate(max_points = max(points))

# A tibble: 8 x 5
# Groups: team, position, starter [6]
  team position starter points max_points
                 
1 AGY 99 104
2 AGY 104 104
3 AFY 119 119
4 AFN 113 113
5 BGY 99 99
6 BGN 104 104
7 BFN 119 119
8 BFN 113 119

这对应于前面示例的结果。

但是,请注意,在group_by()函数中排除列比键入所有其他列的名称要容易得多。

其他资源

以下教程解释了如何使用 dplyr 执行其他常见任务:

如何使用 dplyr 过滤包含特定字符串的行
如何使用 dplyr 计算相对频率
如何使用 dplyr 按组选择第一行

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注