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)