删除重复的行

时间:2015-07-08 10:30:10

标签: r duplicates data.table

此问题已经回答here,但无法使其正常工作。

我这里有一个数据框,有兴趣根据 @Override public void onBackPressed() { super.onBackPressed(); FragmentManager fm = getSupportFragmentManager(); if (fm.getBackStackEntryCount() == 1) { //your code goes here } else if (fm.getBackStackEntryCount() > 1) { fm.popBackStack(); //your code goes here } else { fm.popBackStack(); //your code goes here } } 删除重复的行。检查列SYMBOL以删除重复项。优先级为CALL。如果P>A>M保持P,A,M,如果P,请保留A,M,否则A

M

我尝试了找到Here

的代码
      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

1 个答案:

答案 0 :(得分:4)

您可以使用order(在i位置)订购" CALL"通过按正确顺序指定的factor转换为levels的列,并对第一个观察(.SD[1L])进行分组,按“符号”分组

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)

或在which.min

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