为每个类别分配最小值和最大值,而不按类别分组

Posted

技术标签:

【中文标题】为每个类别分配最小值和最大值,而不按类别分组【英文标题】:Assign min and max value to each Category without grouping by Category 【发布时间】:2020-10-22 19:24:13 【问题描述】:

假设我有 2 列

Category  Value
A         10
B         4
C         5
A         7
B         2
B         8

我想创建新列 MAX 和 MIN,它们为每个类别分配最小值和最大值,而不将类别分组为一行。

Category  Value  MIN  MAX
A         10      7    10
B         4       2     8    
C         5       5     5
A         7       7    10
B         2       2     8
B         8       2     8

【问题讨论】:

【参考方案1】:

使用dplyr,这可以通过使用group_by()后跟mutate()来实现:

library(dplyr)

df %>%
  group_by(Category) %>%
  mutate(MIN = min(Value),
         MAX = max(Value)) %>%
  ungroup()

给了

  Category Value   MIN   MAX
  <chr>    <dbl> <dbl> <dbl>
1 A           10     7    10
2 B            4     2     8
3 C            5     5     5
4 A            7     7    10
5 B            2     2     8
6 B            8     2     8

输入

df <- structure(list(Category = c("A", "B", "C", "A", "B", "B"), Value = c(10, 
4, 5, 7, 2, 8)), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"
), row.names = c(NA, -6L), spec = structure(list(cols = list(
    Category = structure(list(), class = c("collector_character", 
    "collector")), Value = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 1), class = "col_spec"))

【讨论】:

【参考方案2】:

您可以使用ave 获取每个组的minmax

df$MIN <- ave(df$Value, df$Category, FUN=min)
df$MAX <- ave(df$Value, df$Category, FUN=max)
df
#  Category Value MIN MAX
#1        A    10   7  10
#2        B     4   2   8
#3        C     5   5   5
#4        A     7   7  10
#5        B     2   2   8
#6        B     8   2   8

【讨论】:

以上是关于为每个类别分配最小值和最大值,而不按类别分组的主要内容,如果未能解决你的问题,请参考以下文章

获取分组后取某字段最大一条记录(求每个类别中最大的值的列表)

工作分配算法

SQL中分组时间序列的最小值和最大值

oracle分组后取出根据某列分组后的最大值

关于SQL多类别汇总取最大值的实现

python:总结每个类别的最后一个和最大的单元格