以下是我尝试过滤的df部分的示例
Gene Chr Start End V5 Strand
ENSMUSG00000028364 chr4 64012669 64020725 . -
ENSMUSG00000028364 chr4 63959785 64047015 . -
ENSMUSG00000018387 chr11 53457249 53467501 . +
ENSMUSG00000018387 chr11 53457205 53467766 . +
对于每个基因,我希望在第3列和第4列中保留第一个(或最后一个)值,具体取决于该基因位于哪条链上。我尝试了几种不同的方法,但是都给出了错误并且无法正常工作
df <- df %>%
group_by(Gene) %>%
ifelse(df$Strand == "+", (filter(Start==first(Start), End ==first(End))), (filter(End==last(End), Start ==last(Start))))
Error in ifelse(., df$Strand == "+", (filter(Start == first(Start), : unused argument ((filter(End == last(End), Start == last(Start))))
df <- df %>%
group_by(Gene) %>%
{if (df$Strand == "+") filter(Start==first(Start), End ==first(End)) else filter(End==last(End), Start ==last(Start))}
Error in filter(Start == first(Start), End == first(End)) : object 'Start' not found
In addition: Warning message:
In if (df$Strand == "+") filter(Start == first(Start), :
Error in filter(Start == first(Start), End == first(End)) : object 'Start' not found
这是我过滤后想要的,对于每个基因,如果链为+,则使整行的起始和末端坐标保持最小(首先在起始处过滤,然后在末端过滤),如果链为负,则保持开始和结束坐标最大的行(在结束坐标上第一个过滤器,然后是开始)。
Gene Chr Start End V5 Strand
ENSMUSG00000028364 chr4 63959785 64047015 . -
ENSMUSG00000018387 chr11 53457249 53467501 . +
有什么建议可以进行这项工作吗?谢谢!
我认为您正在使用来寻找类似的内容filter
。
library(tidyverse)
df %>%
group_by(Gene) %>%
# Get first row for "+" and last for "-"
filter(Strand == "+" & row_number() == 1 | Strand == "-" & row_number() == n())
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句