R:有条件地删除重复的行

时间:2016-12-14 18:45:50

标签: r

我在R中有一个包含两列的大型有序数据框,"基因"和" rank",我想在正方向上删除第二次出现的重复行 AND 在负方向上第一次出现重复行。

例如,在下面的数据集中,我想删除第6262和12200行,这样我就可以在任一方向上保持具有最大等级值的基因:

> head(a_ordered, n=10)
              gene     rank
10597      SLC37A1  2.827330
6262       SLC37A1  2.700882
12504         UBR4  2.698938
10934        SP110  2.690130
1563         CALB1  2.633179
6031  LOC100128239 -2.499959
6718        MBTPS1 -2.513134
1528          CA14 -2.549553
12200        NXPE3 -2.850011
7978         NXPE3 -3.153175

变为

 > head(a_ordered, n=10)
                  gene     rank
    10597      SLC37A1  2.827330
    12504         UBR4  2.698938
    10934        SP110  2.690130
    1563         CALB1  2.633179
    6031  LOC100128239 -2.499959
    6718        MBTPS1 -2.513134
    1528          CA14 -2.549553
    7978         NXPE3 -3.153175

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用dplyr::filter保留abs(rank) == max(abs(rank))gene分组的行:

library(dplyr)
res <- df %>% group_by(gene) %>% filter(abs(rank) == max(abs(rank)))
##Source: local data frame [8 x 3]
##Groups: gene [8]
##
##     ID         gene      rank
##  <int>        <chr>     <dbl>
##1 10597      SLC37A1  2.827330
##2 12504         UBR4  2.698938
##3 10934        SP110  2.690130
##4  1563        CALB1  2.633179
##5  6031 LOC100128239 -2.499959
##6  6718       MBTPS1 -2.513134
##7  1528         CA14 -2.549553
##8  7978        NXPE3 -3.153175

数据:

df <- structure(list(ID = c(10597L, 6262L, 12504L, 10934L, 1563L, 6031L, 
6718L, 1528L, 12200L, 7978L), gene = c("SLC37A1", "SLC37A1", 
"UBR4", "SP110", "CALB1", "LOC100128239", "MBTPS1", "CA14", "NXPE3", 
"NXPE3"), rank = c(2.82733, 2.700882, 2.698938, 2.69013, 2.633179, 
-2.499959, -2.513134, -2.549553, -2.850011, -3.153175)), .Names = c("ID", 
"gene", "rank"), class = "data.frame", row.names = c(NA, -10L
))
##      ID         gene      rank
##1  10597      SLC37A1  2.827330
##2   6262      SLC37A1  2.700882
##3  12504         UBR4  2.698938
##4  10934        SP110  2.690130
##5   1563        CALB1  2.633179
##6   6031 LOC100128239 -2.499959
##7   6718       MBTPS1 -2.513134
##8   1528         CA14 -2.549553
##9  12200        NXPE3 -2.850011
##10  7978        NXPE3 -3.153175

答案 1 :(得分:0)

如果要保持与零差异最大的值,可以使用平方值,然后相应地对数据框进行排序

a_ordered$rank2 <- a_ordered$rank^2
a_ordered <- a_ordered[order(a_ordered$rank2, decreasing = TRUE),]
a_ordered <- a_ordered[-(duplicated(a_ordered$gene)==TRUE),]

重复将从上到下通过列,并将第二个(和第三个等)值标记为重复。