2015-07-08 2 views
1

На данный момент данный вопрос не ответил here, но не смог заставить его работать.Удалите повторяющиеся строки

У меня есть кадр данных, который интересует удаление повторяющихся строк на основе SYMBOL. Проверка столбца CALL для удаления дубликатов. Приоритет 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 

Я попытался код, который я нашел Here

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 

ответ

4

Вы можете использовать orderi-й позиции), чтобы заказать столбец «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 для су bset строк.

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'))))