【问题标题】:Find maximum value of one column based on group_by multiple other columns根据 group_by 多个其他列查找一列的最大值
【发布时间】:2021-08-21 22:17:35
【问题描述】:

我在 R 中有如下形式的表格:

| COUNTRY | date_start | code  | bin | ord |
| -----------------------------------------|
| Chile   | 04/11/2020 | 4.5.1 | 1   |  3  |
| Chile   | 04/11/2020 | 4.5.2 | 1   |  0  |   
| Norway  | 23/02/2021 | 4.4.1 | 1   |  2  |
| Norway  | 23/02/2021 | 4.4.2 | 0   |  1  |
| Norway  | 25/02/2021 | 4.4.2 | 0   |  1  |

首先我想删除列“who_code”,然后我想创建一个额外列“ordMax”,并用给定“国家”和“日期开始”的“奥德”列的最大值填充它.所以在这个例子中,新列是

| COUNTRY | date_start | bin | ord | ordMax |
| ------------------------------------------|
| Chile   | 04/11/2020 | 1   |  3  |    3   |
| Chile   | 04/11/2020 | 1   |  0  |    3   |   
| Norway  | 23/02/2021 | 1   |  2  |    2   |
| Norway  | 23/02/2021 | 0   |  1  |    2   |
| Norway  | 25/02/2021 | 0   |  1  |    1   |

我在 R 中尝试了几种方法,同时使用了“聚合”和 dplyr 库,但似乎没有任何效果。我尝试过的其中一件事是:

df_k_reduced <- df_k %>%
  group_by(COUNTRY, date_start) %>%
  select(-code) %>%
  summarise(ordMax = max(ord))

但这给出了类似的东西:

    | COUNTRY | date_start | ordMax |
    | ------------------------------|
    | Chile   | 04/11/2020 |    3   |   
    | Norway  | 23/02/2021 |    2   |
    | Norway  | 25/02/2021 |    1   |

请注意,'bin' 和原始的 'ord' 列也已被删除,尽管这不是最初的意图。

我如何获得带有该额外列的表,其中唯一删除的列是“代码”,并且没有删除任何行?

【问题讨论】:

    标签: r dataframe dplyr group-by data-cleaning


    【解决方案1】:

    data.table方式

    样本数据

    library(data.table)
    DT <- fread("COUNTRY | date_start | code  | bin | ord
      Chile   | 04/11/2020 | 4.5.1 | 1   |  3  
       Chile   | 04/11/2020 | 4.5.2 | 1   |  0     
       Norway  | 23/02/2021 | 4.4.1 | 1   |  2  
       Norway  | 23/02/2021 | 4.4.2 | 0   |  1  
       Norway  | 25/02/2021 | 4.4.2 | 0   |  1  ")
    

    代码

    DT[, ordMax := max(ord), by = .(COUNTRY, date_start)][, code := NULL][]
    

    输出

    #    COUNTRY date_start bin ord ordMax
    # 1:   Chile 04/11/2020   1   3      3
    # 2:   Chile 04/11/2020   1   0      3
    # 3:  Norway 23/02/2021   1   2      2
    # 4:  Norway 23/02/2021   0   1      2
    # 5:  Norway 25/02/2021   0   1      1
    

    【讨论】:

    • 听起来很有趣。我还应该补充一点,我的原始表实际上要大得多,并且是一个现有的数据框(出于这些目的,我将其称为“df_k”)。我尝试了 DT
    • data.table::setDT(df_k)
    • 所以library(data.table);setDT(df_k)[, ordMax := max(ord), by = .(COUNTRY, date_start)][, code := NULL][] 应该可以正常工作..(注意:这会永久更改您的 df_k-data!)
    • 转换回data.frame,使用setDF()
    • 是的,已经做到了。谢谢。所以基本上,我使用 DT
    【解决方案2】:

    我们可以使用slice_max 代替summarise 来返回select 步骤之后的所有列

    library(dplyr)
    df_k %>%
      group_by(COUNTRY, date_start) %>%
      select(-code) %>%
      slice_max(order_by = 'ord', n = 1)
    

    如果我们需要创建一个新列,请使用mutate

    df_k %>%
        group_by(COUNTRY, date_start) %>%
        select(-code) %>%
        mutate(ordMax = max(ord, na.rm = TRUE)) %>%
        ungroup
    

    【讨论】:

    • 该方法的作用是将现有的“ord”列替换为最大值。是否可以保留原始的“ord”列,同时将这些最大值放在新列中?
    猜你喜欢
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2021-08-09
    相关资源
    最近更新 更多