Условный фильтр строк по значениям нескольких переменных в предыдущей строке - PullRequest
3 голосов
/ 15 апреля 2019

Я пытаюсь установить подкадр данных, чтобы сохранить только те строки, для которых значение двух переменных отличается от значения ранее сохраненной строки.

Начиная с

df<-structure(list(x = c("ARM018", "ARM018", "ARM018", "ARM021", 
"ARM021"), y = c("ARF014", "ARF027", "ARF028", 
"ARF014", "ARF020")), class = "data.frame", row.names = c(NA, 
-5L))

df

Я хотел бы получить

df_wanted <-structure(list(x = c("ARM018", "ARM021"), y = c("ARF014", 
"ARF020")), class = "data.frame", row.names = c(NA, -2L))

df_wanted

, поскольку значения x и y различаются в двух строках

Я предполагал, что функция lag из пакета dplyr может помочь и что следующий код вернет df_wanted, но он все же вернет ожидаемый результат

library(dplyr)

df_attempt<-df %>% 
  filter(lag(x)!=x & lag(y)!=y)


Есть ли какое-либо решение для этого с использованием задержкифункционировать?

1 Ответ

0 голосов
/ 16 апреля 2019

комбинация dplyr:cumsum и dplyr:lag может добиться цели:

library(dplyr)
df %>% mutate_all(as.character) %>% 
  filter(cumsum(x != x[1] & y != y[1]) != 
                lag(cumsum(x != x[1] & y != y[1]), default = -1))

       x      y
1 ARM018 ARF014
2 ARM021 ARF020
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...