【问题标题】:Filter a dataset having duplicated rows in R在 R 中过滤具有重复行的数据集
【发布时间】:2020-11-02 18:04:52
【问题描述】:

我需要根据两个条件过滤数据集。

这是我的数据集的样子:

df <- data.frame(
  id = c(1,2,2,3,3,4,5,5),
  district = c(10,10,11,12,12,13,14,15),
  value = c(10.2, 10.8, 10.8, 7.5, 9.3, 6, 7.0, 7.0))


> df
  id district value
1  1       10  10.2
2  2       10  10.8
3  2       11  10.8
4  3       12   7.5
5  3       12   9.3
6  4       13   6.0
7  5       14   7.0
8  5       15   7.0

我根据ids 复制了行。为了保持所需的行, Firstids 有复合区但相同value,我需要保留第一行: Secondids 有多个values,但是来自同一个区,我需要值行的max

所以所需的过滤数据集是:

> df
  id district value
1  1       10  10.2
2  2       10  10.8
3  3       12   9.3
4  4       13   6.0
5  5       14   7.0

到目前为止,我只能找到重复的 ID。

df[duplicated(df$id),]

有人有什么想法吗? 谢谢

【问题讨论】:

    标签: r filter


    【解决方案1】:

    dplyr:

    df %>% 
      group_by(id) %>%
      arrange(desc(value)) %>%
      slice(1)
    # # A tibble: 5 x 3
    # # Groups:   id [5]
    #      id district value
    #   <dbl>    <dbl> <dbl>
    # 1     1       10  10.2
    # 2     2       10  10.8
    # 3     3       12   9.3
    # 4     4       13   6  
    # 5     5       14   7  
    

    如果有多个值,则没有必要区分最大值,如果有重复则保留第一个值 - 如果我们按 value 降序排列数据并保留每个 id 组中的第一行,它以一种逻辑完成这两项任务。

    【讨论】:

    • 是的,你是对的,不需要两个过滤条件。你比我更能回答我的问题。感谢您的宝贵时间!
    【解决方案2】:
    library(dplyr)
    
    df %>%
      arrange(id, -value) %>%
      distinct(id, district, .keep_all = TRUE) %>%
      distinct(id, value, .keep_all = TRUE)
    
          id district value
    1  1       10  10.2
    2  2       10  10.8
    3  3       12   9.3
    4  4       13   6.0
    5  5       14   7.0
    

    首先我们按值降序排序,然后使用distinct 函数查找唯一组合。

    【讨论】:

    • @GregorThomas 是的,谢谢,我已经想通了。我们的两种解决方案现在都按预期工作
    • 我会小心在非整数数字列上使用distinct...浮点精度问题可能会导致问题。
    【解决方案3】:

    base R 中,我们可以在order 行之后使用duplicated

    df1 <- df[order(df$id, -df$value),]
    df1[!duplicated(df1$id),]
    #  id district value
    #1  1       10  10.2
    #2  2       10  10.8
    #5  3       12   9.3
    #6  4       13   6.0
    #7  5       14   7.0
    

    【讨论】:

      猜你喜欢
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多