Фильтр на основе конкретного условия в векторе - PullRequest
1 голос
/ 14 мая 2019

У меня есть следующая таблица, и я хотел бы отфильтровать на основе следующих критериев

Сначала реплицировать данные:

dt1 <- data.frame(ID = c("a", "a", "a", "a", "a","a","a","a",
                     "b","b","b","b","b","b","b","b",
                     "c","c","c","c","c","c","c","c",
                     "d","d","d","d","d","d","d","d"), value = c(0,0,1,1,2,0,0,1,
                                                                 1,1,1,2,2,2,2,2,
                                                                 1,1,1,1,1,3,3,3,
                                                                 0,2,2,2,2,2,2,3))

Теперь я хотел бы создать условие по идентификатору, напримерчто оно удовлетворяет следующему условию:

1) Увеличение значения (> = 1)
2) Увеличение значения остается тем же
3) Минимальное начало увеличения должно бытьв последних 3 последовательных строках (в основном идентификатор: «D» не соответствует)

Согласно приведенной выше таблице, только B и C соответствуют требованиям

До сих пор я сделал следующее, но это не такработает для меня должным образом особенно 3-х критериев.

dt1 %>% group_by(ID) %>% mutate(change = value -lag(value)) 
%>% filter(all(change %in% c(2,1,0,NA), na.rm = T))

1 Ответ

2 голосов
/ 14 мая 2019

Можно было бы сгруппировать по 'ID', filter группы, которые имеют только увеличивающиеся смежные элементы, но не уменьшающие значения, а затем отфильтровать группы с частотой 'значения', большей или равной 3 для all элементы

library(tidyverse)
library(data.table)
dt1 %>%
   group_by(ID) %>% 
   filter(n_distinct(cumsum(c(1, diff(value)  < 0))) == 1) %>%        
   filter(all(table(rleid(value))>=3))
# A tibble: 16 x 2
# Groups:   ID [4]
#   ID    value
#   <fct> <dbl>
# 1 b         1
# 2 b         1
# 3 b         1
# 4 b         2
# 5 b         2
# 6 b         2
# 7 b         2
# 8 b         2
# 9 c         1
#10 c         1
#11 c         1
#12 c         1
#13 c         1
#14 c         3
#15 c         3
#16 c         3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...