如何计算条件的真值,直到在R中发现假值

如何计算条件的真值,直到在R中发现假值,r,while-loop,count,row,R,While Loop,Count,Row,我有一个数据框,其中有一列是染色体,另一列是物理位置,最后一个是有真值或假值的条件。当位置的i+1值和位置的i值之间的差值不大于示例中的某个值时,此条件为1000 我想计算在该位置的确定范围内有多少个真值,直到找到一个假值 由于我的原始数据帧太长,我将留下一个示例 CHR <- c(1,1,1,1,2,2,2,3,3,3,3) POS <- c(10,10000,12000,15000,25,75,50000,50,100,40000,45000) CONDITION <- c

我有一个数据框,其中有一列是染色体,另一列是物理位置,最后一个是有真值或假值的条件。当位置的i+1值和位置的i值之间的差值不大于示例中的某个值时,此条件为1000

我想计算在该位置的确定范围内有多少个真值,直到找到一个假值

由于我的原始数据帧太长,我将留下一个示例

CHR <- c(1,1,1,1,2,2,2,3,3,3,3)
POS <- c(10,10000,12000,15000,25,75,50000,50,100,40000,45000)
CONDITION <- c(F,T,T,F,T,F,F,T,F,T,F)
df <- data.frame(CHR,POS,CONDITION)
我想得到这样的东西:

CHR_r <- c(1,1,2,2,3,3)
from <- c(10,10000,25,50000,50,40000)
to <- c(10,15000,75,50000,100,45000)
count <- c(1,3,2,1,2,2)
result <- data.frame(CHR_r,from,to,count)
完成这项任务的最佳方式是什么?我曾想过使用while循环,但我遇到的问题是,每次发现FALSE时,它都会退出循环。我考虑过的另一件事是使用sequencerle,但结果与我预期的不符,可能是因为它比我想要的更复杂。

我从data.table::rleid开始,但这不起作用,因为您希望在前面的TRUE中包含FALSE。相反,我最终为一个新组的开始创建了一个条件,并在该条件下使用cumsum创建组索引。据我所知,在每个CHR组中,如果a是第一行,你想启动一个新组,如果a前面有一个TRUE,b前面有一个FALSE,或者c前面有一个FALSE,那么我把它放在case_when语句中。写出来后,似乎条件b和c可以很容易地压缩到前一行是错误的,但我会保持原样,以防缺少值或其他东西

library(dplyr)
df %>%
  group_by(CHR) %>%
  mutate(group_break = case_when(
    row_number() == 1 ~ 1,
    CONDITION & !lag(CONDITION, 1) ~ 1,
    !CONDITION & !lag(CONDITION, 1) ~ 1,
    TRUE ~ 0
  ),
  group_ind = cumsum(group_break)
  ) %>%
  group_by(CHR, group_ind) %>%
  summarize(from = first(POS), to = last(POS), count = n())
# # A tibble: 6 x 5
# # Groups:   CHR [3]
#     CHR group_ind  from    to count
#   <dbl>     <dbl> <dbl> <dbl> <int>
# 1     1         1    10    10     1
# 2     1         2 10000 15000     3
# 3     2         1    25    75     2
# 4     2         2 50000 50000     1
# 5     3         1    50   100     2
# 6     3         2 40000 45000     2

您似乎在寻找的是位置的直方图,即计算在特定间隔内找到的位置数。您的数组from和to看起来有点奇怪,因为第一个间隔是从10到10

您必须使用函数的选项来控制间隔

你似乎在问自己怎么做。您可以使用该函数对阵列进行测试。在你提出问题之后再试试那个代码

count_of=c(0,length(from))
for  (i in c(1:length(from))){
  ind=which(POS>from[i] & POS<to[i]) 
  count_of[i]=length(ind)
}
让我知道这是否有效。 谢谢

另一个带有rleid的选项


如果变量是手工创建的,那么您的方法在示例中是有效的,但是对于原始数据集来说,它是不可伸缩的。这是因为列“from”尚未创建,并且是预期的结果。但正如我所说,它对创建的示例有效。虽然我得到的结果与@Gregor Thomas的答案相同,但我没有CHR列作为结果。“这是非常必要的。”施伦德拉不清楚。这里,我用“CHR”和“grp”进行分组,你能改变吗
library(dplyr)
library(data.table)
df %>% 
   group_by(CHR) %>% 
   group_by(grp = pmax(rleid(pmax(CONDITION, lag(CONDITION, 
         default = first(CONDITION)))), cumsum(CONDITION)), .add = TRUE) %>%
   summarise(from = first(POS), to = last(POS), count = n())  %>% 
   ungroup %>%
   select(-grp)
# A tibble: 6 x 4
#    CHR  from    to count
#  <dbl> <dbl> <dbl> <int>
#1     1    10    10     1
#2     1 10000 15000     3
#3     2    25    75     2
#4     2 50000 50000     1
#5     3    50   100     2
#6     3 40000 45000     2