here已经回答了这个问题,但无法使它工作。
这里有一个数据框架,有兴趣删除基于SYMBOL的重复行。检查列CALL以删除duplicates.The优先级是P>A>M.If 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发布于 2015-07-08 10:33:04
您可以使用order (在ith位置)对"CALL“列进行排序,方法是转换为具有按正确顺序指定的levels的factor,并将第一个观察(.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'))))https://stackoverflow.com/questions/31290021
复制相似问题