R 如何在两个特定值之间筛选行

R 如何在两个特定值之间筛选行,r,R,我需要帮助过滤以下数据帧(这是一个简单的示例): 我需要根据第二列(距离)进行过滤,使其如下所示: mutation distance 3 - FALSE 4 - FALSE 5 mutation FALSE 6 + FALSE 我需要删除所有行,直到最后一行TRUE,该行位于具有mx$mutation=mutation值的行之前(因此第1行和第2行),以及在mx$mutation=mutation之后发生的第一行TRUE之

我需要帮助过滤以下数据帧(这是一个简单的示例):

我需要根据第二列(距离)进行过滤,使其如下所示:

  mutation distance
3        -    FALSE
4        -    FALSE
5 mutation    FALSE
6        +    FALSE

我需要删除所有行,直到最后一行
TRUE
,该行位于具有
mx$mutation=mutation
值的行之前(因此第1行和第2行),以及在
mx$mutation=mutation
之后发生的第一行
TRUE
之后的所有行(因此第7行和以后)

library(dplyr)
mx %>%
  group_by(grp = cumsum(distance)) %>% 
  filter(any(mutation == "mutation") & !distance) %>%
  ungroup %>% 
  select(-grp)
# A tibble: 4 x 2
# mutation distance
#  <fctr>   <lgl>   
#1 -        F       
#2 -        F       
#3 mutation F       
#4 +        F       
希望这有帮助

#示例数据(注意,我在末尾添加了一些额外的行)
mx=data.frame(突变=c(“-”、“-”、“-”、“-”、“-”、“突变”、“+”、“+”、“+”、“+”、“-”、“突变”、“+”、“+”),
距离=c(F,T,F,F,F,F,F,T,F,F,F,F,T))

突变\u idx您可以使用which()方法适当地标识行:

# get rownum of last TRUE before df$mutation=mutation
last_true_before_mutation <- max(which(mx$distance == 'TRUE')[which(mx$distance == 'TRUE') < which(mx$mutation == 'mutation')])

# get rownum of first TRUE after df$mutation=mutation
first_true_after_mutation <- min(which(mx$distance == 'TRUE')[which(mx$distance == 'TRUE') > which(mx$mutation == 'mutation')])

# all rows to remove 
rem_rows <- c(seq(1:last_true_before_mutation), seq(first_true_after_mutation, nrow(mx)))

# remove approproate rows
mx[-rem_rows, ]

mx = data.frame(c("-", "-", "-", "-", "mutation", "+", "+", "+", "+") ,
                      c(F, T, F, F, F, F, T, F,T)) 
   mutation distance
3         -    FALSE
4         -    FALSE
5  mutation    FALSE
6         +    FALSE
10        -    FALSE
11 mutation    FALSE
12        +    FALSE
# get rownum of last TRUE before df$mutation=mutation
last_true_before_mutation <- max(which(mx$distance == 'TRUE')[which(mx$distance == 'TRUE') < which(mx$mutation == 'mutation')])

# get rownum of first TRUE after df$mutation=mutation
first_true_after_mutation <- min(which(mx$distance == 'TRUE')[which(mx$distance == 'TRUE') > which(mx$mutation == 'mutation')])

# all rows to remove 
rem_rows <- c(seq(1:last_true_before_mutation), seq(first_true_after_mutation, nrow(mx)))

# remove approproate rows
mx[-rem_rows, ]
before_after_mutation <- function(df) {
    last_true_before_mutation <- max(which(df$distance == 'TRUE')[which(df$distance == 'TRUE') < which(df$mutation == 'mutation')])
    first_true_after_mutation <- min(which(df$distance == 'TRUE')[which(df$distance == 'TRUE') > which(df$mutation == 'mutation')])
    rem_rows <- c(seq(1:last_true_before_mutation), seq(first_true_after_mutation, nrow(df)))
    res <- df[-rem_rows,]
    return(res)
}
before_after_mutation(mx)