我有这个tbl:
Genes strand mode_position
1: 2L52.1 + 1638
2: 2L52.1 + 2096
3: npr-30 + 3156
4: homt-1 - 6081
5: B0348.5 + 6383
如果有重复的基因,并且支架是+,我需要保留具有最高值的mode_position的行,如果-,则保留具有最低值的行。因此,对于2L52.1,它应该只保留第2行。我尝试了group_by(Genes) %>% if_else("strand" == "+", slice_max(mode_position, n=1))
,但这显然不起作用,因为"条件"必须是一个逻辑向量。case_when对字符不起作用?还有其他选择吗?
谢谢!
您可以将if
/else
与which.max
和which.min
一起使用以获得最大和最小行。
library(dplyr)
df %>%
group_by(Genes) %>%
slice(if(all(strand == '+')) which.max(mode_position)
else which.min(mode_position)) %>%
ungroup
# Genes strand mode_position
# <chr> <chr> <int>
#1 2L52.1 + 2096
#2 B0348.5 + 6383
#3 homt-1 - 6081
#4 npr-30 + 3156
数据
df <- structure(list(Genes = c("2L52.1", "2L52.1", "npr-30", "homt-1",
"B0348.5"), strand = c("+", "+", "+", "-", "+"), mode_position = c(1638L,
2096L, 3156L, 6081L, 6383L)), class = "data.frame", row.names = c(NA, -5L))