【问题标题】:In case of duplicated value in variable, keep row with lowest value based on other variable [duplicate]如果变量中的值重复,请根据其他变量保留具有最低值的行[重复]
【发布时间】:2021-06-14 04:48:46
【问题描述】:

假设我有

> df
   ID  tti
1 118 11.2
2 118  1.4
3 118  9.2
4   9  2.7
5  12  1.2
6  12 82.8

df$ID 中存在唯一值和重复值。如果df$ID 中的值重复,我想保留df$tti 值最低的行。

预期输出

> df
   ID  tti
1 118  1.4
2   9  2.7
3  12  1.2

我正在dplyr寻找解决方案

数据

df <- structure(list(ID = c(118L, 118L, 118L, 9L, 12L, 12L), tti = c(11.2, 
1.4, 9.2, 2.7, 1.2, 82.8)), class = "data.frame", row.names = c(NA, 
-6L)) 

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    我们可以通过'ID'分组后使用slice_min

    library(dplyr)
    df %>%
        group_by(ID) %>%
        slice_min(tti) %>%
        ungroup
    

    -输出

    # A tibble: 3 x 2
    #     ID   tti
    #  <int> <dbl>
    #1     9   2.7
    #2    12   1.2
    #3   118   1.4
    

    或者collapse

    library(collapse)
    df %>%
        fgroup_by(ID) %>%
        fsummarise(tti = fmin(tti))
    
    #   ID tti
    #1   9 2.7
    #2  12 1.2
    #3 118 1.4
    

    或者另一个选项是roworder(比dplyr中的arrange更快)和funique

    roworder(df, ID, tti) %>%
         funique(cols = 1)
    #    ID tti
    #1   9 2.7
    #2  12 1.2
    #3 118 1.4
    

    【讨论】:

      【解决方案2】:

      默认情况下distinct 保留重复的ID 的第一行。因此,如果数据首先在ID 中按tti 排序,那么第一行也将是tti 的最小值。默认arrange按升序排列数据。

      library(dplyr)
      df %>% 
        dplyr::arrange(ID, tti) %>% 
        dplyr::distinct(ID, .keep_all = T)
      

      输出

         ID tti
      1   9 2.7
      2  12 1.2
      3 118 1.4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-25
        • 2015-09-13
        • 2020-10-04
        • 1970-01-01
        • 1970-01-01
        • 2022-11-04
        • 1970-01-01
        • 2021-12-23
        相关资源
        最近更新 更多