Условный оператор для групп строк кадра данных R - PullRequest
1 голос
/ 25 мая 2020

Представьте, что у меня есть этот фрейм данных:

position    coverage
   1           30
   2            2
   3            1
   4            8
   5            2
   6            3
   7            20
   8            40
   .             .
   .             .
  100            0
  101            2
  102            3
  103            4
  104            1
  105           40

Я хотел бы получить те регионы, где по крайней мере по 4 позициям покрытие ниже значения 10.

В этом В этом случае желаемый результат:

start      end
  2         6
 100       104 

Я пробовал использовать для l oop, но не знаю, как его построить для работы с группой строк вместо строки за строкой. Вы знаете, как мне добиться такого результата?

1 Ответ

2 голосов
/ 25 мая 2020

Мы можем использовать rleid из data.table. Создан индекс группировки на основе значений «покрытия» меньше 10, подмножество «позиции», где количество строк больше или равно 4 и all из «покрытия» меньше 10, затем используйте «grp ', чтобы получить элементы first и last из' position '

library(data.table)
setDT(df1)[, position[.N >=4 & all(coverage < 10)],
         .(grp = rleid(coverage < 10))][,
      .(start = first(V1), end = last(V1)), grp][, grp := NULL][]
#    start end
#1:     2   6
#2:   100 104

Или с dplyr

library(dplyr)
df1 %>% 
   group_by(grp = rleid(coverage < 10)) %>% 
   filter(all(coverage < 10), n() >=4) %>% 
   group_by(grp) %>% 
   summarise(start = first(position), end = last(position)) %>% 
   select(-grp)

Или с rle из base R

rl <- rle(df1$coverage < 10)
do.call(rbind, lapply(split(df1$position,
   rep(seq_along(rl$values), rl$lengths)), range)[rl$values & rl$lengths >= 4])

данные

df1 <- structure(list(position = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 100L, 
101L, 102L, 103L, 104L, 105L), coverage = c(30L, 2L, 1L, 8L, 
2L, 3L, 20L, 40L, 0L, 2L, 3L, 4L, 1L, 40L)), class = "data.frame", 
row.names = c(NA, 
-14L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...