我在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
谢谢!
答案 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),]
重复将从上到下通过列,并将第二个(和第三个等)值标记为重复。