删除重复行

Remove duplicate rows

这个问题已经回答了,但无法解决。

我这里有一个数据框,有兴趣删除基于SYMBOL的重复行。检查列 CALL 以删除 duplicates.The 优先级是 P>A>M。如果 P,A,M 保留 P,如果 A,M,则保留 A , 否则 M.

      SYMBOL  INTENSITY  CALL
1     DDR1    596.95050    P
2     RFC2    420.28708    P
3     HSPA6   510.73254    P
4     DDR1   1717.99487    A
5     GUCA1A  121.53488    A
6     UBA7   1810.49780    P
7     UBA7    301.51944    M
8     GUCA1A   34.53987    A
9     CCL5   5966.24609    P
10    CYP2E1   95.15707    A
11    CYP2E1  164.95276    M
12    ESRRA  1024.88745    P
13    CYP2A6  502.48877    A
14    GAS6    921.70923    P
15    MMP14   524.96863    A
16    GAS6   3069.48462    P
17    FNTB    266.77686    A
18    PLD1    187.65569    A
19    PLD1   1891.04541    P
20    PLD1    258.79028    M

我尝试了找到的代码

library(data.table)
setDT(df)[, list(CALL=CALL[which.min(factor(CALL, levels=c('P', 'A', 'M')))]),
                                   .(SYMBOL)]

但是我删除了第二列INTENSITY。任何帮助,请确保代码也是最快的。谢谢

预期输出

          SYMBOL  INTENSITY  CALL
    1     DDR1    596.95050    P
    2     RFC2    420.28708    P
    3     HSPA6   510.73254    P
    5     GUCA1A  121.53488    A
    6     UBA7   1810.49780    P
    9     CCL5   5966.24609    P
    10    CYP2E1   95.15707    A
    12    ESRRA  1024.88745    P
    13    CYP2A6  502.48877    A
    14    GAS6    921.70923    P
    15    MMP14   524.96863    A
    17    FNTB    266.77686    A
    19    PLD1   1891.04541    P

您可以使用 order(在第 i 位置)通过转换为 factor 并指定 levels 来对 "CALL" 列进行排序按照正确的顺序,将第一个观察值 (.SD[1L]) 分组,按 'SYMBOL'

分组
library(data.table)
setDT(df)[order(factor(CALL, levels=c('P', 'A', 'M'))),
                                 .SD[1L], by = SYMBOL]

或者只是修改您的代码,而不是 list(CALL=..,我们可以使用 .SD 对行进行子集化。

setDT(df)[, .SD[which.min(factor(CALL, levels=c('P', 'A', 'M')))], .(SYMBOL)]

使用dplyr的一个选项是

library(dplyr)
df %>%
    group_by(SYMBOL) %>%
    arrange(factor(CALL, levels=c('P', 'A', 'M'))) %>%
    slice(1L)

或在 slice

内使用 which.min
df %>%
    group_by(SYMBOL) %>%
    slice(which.min(factor(CALL, levels=c('P', 'A', 'M'))))