我在 R 中有一个大型有序数据框,其中包含两列“gene”和“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
谢谢!
最佳答案
您可以使用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
关于R:有条件地删除重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41149914/