删除重复行
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'))))
这个问题已经回答了
我这里有一个数据框,有兴趣删除基于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'))))