【问题标题】:R- selecting a row based on characteristics of another column in that row [duplicate]R-根据该行中另一列的特征选择一行[重复]
【发布时间】:2015-06-22 22:22:07
【问题描述】:

所以我有以下data.frame

    num      id

1   44982   44979
2   44981   44979
3   43554   43551
4   43552   43551
5   42510   42507
6   42509   42507
7   41997   41994
8   41996   41994
9   40519   40517
10  40519   40517
11  40039   40036
12  40038   40036
13  31337   31335
14  31336   31335
15  31247   31245
16  31246   31245
17  43984   28769
18  28770   28769
19  27620   27618
20  27619   27618

可以看出,“id”列中有重复项。我想做的是根据“num”列中的最大值选择要保留的副本。因此,当遇到 id 列中的重复项时,代码会查看 num 列,找到最高值行并删除最低值。输出应如下所示。

        num      id

1       44982   44979
2       43554   43551
3       42510   42507
4       41997   41994
5       40519   40517
6       40039   40036
7       31337   31335
8       31247   31245
9       43984   28769
10      27620   27618
11      27497   27495
12      44317   27374
13      10892   10697
14      10612   10606
15      10445   10443
16      10361   10359
17      10063   10061
18      9673    9671
19      9601    9599
20      8148    8146

提前感谢您的帮助

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    标准的 R 解决方案是:

    aggregate(num~id, dat, max)
    

    结果:

          id   num
    1  27618 27620
    2  28769 43984
    3  31245 31247
    4  31335 31337
    5  40036 40039
    6  40517 40519
    7  41994 41997
    8  42507 42510
    9  43551 43554
    10 44979 44982
    

    您也可以使用data.table 执行此操作,如下所示:

    require(data.table)
    setDT(dat)[,.(num = max(num)),by=id]
    setDF(dat) #making dat a normal data.frame again
    

    这将返回每个 id 的最大值为 num。

    【讨论】:

    • 哈哈,你在我输入我的答案时编辑了你的答案。 +1 以获得完整答案!
    • 这太完美了,我忘记了聚合函数!谢谢你们的帮助
    【解决方案2】:

    使用data.table 包的一种可能更快的方法是先按num 降序排序,然后选择唯一的ids

    library(data.table)
    unique(setorder(setDT(df), -num), by = "id")
    #       num    id
    #  1: 44982 44979
    #  2: 43984 28769
    #  3: 43554 43551
    #  4: 42510 42507
    #  5: 41997 41994
    #  6: 40519 40517
    #  7: 40039 40036
    #  8: 31337 31335
    #  9: 31247 31245
    # 10: 27620 27618
    

    【讨论】:

      【解决方案3】:

      你可以按最大值聚合

      maxids <- aggregate(df$num, by=list(df$id), max) # get highest num for each id
      names(maxids) <- c("id", "num") # rename result columns
      

      或如上所示(一步):

      maxids <- aggregate(num~id, df, max)
      

      【讨论】:

        【解决方案4】:

        而且,为了记录,这里有一个 dplyr 答案:

        library(dplyr)
        DF %>% group_by(id) %>% slice(which.max(num))
        #Source: local data frame [10 x 2]
        #Groups: id
        #
        #     num    id
        #1  27620 27618
        #2  43984 28769
        #3  31247 31245
        #4  31337 31335
        #5  40039 40036
        #6  40519 40517
        #7  41997 41994
        #8  42510 42507
        #9  43554 43551
        #10 44982 44979
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-23
          • 1970-01-01
          • 1970-01-01
          • 2017-06-17
          • 2016-07-11
          • 1970-01-01
          • 2016-11-26
          • 2016-09-09
          相关资源
          最近更新 更多