Подмножество данных определенным c способом - PullRequest
1 голос
/ 25 мая 2020

У меня есть набор данных:

x     y
A1  start
A2  ID
A3  delete
A4  start
A5  ID
A6  delete
A7  ID
A8  delete
A9  start
A10 ID
A11 delete
A12 delete
A13 start
A14 ID
A15 start
A16 delete
A17 ID
A18 delete
A19 delete

Как вы видите, в столбце y есть связь: «удалить» следует после «ID». Однако есть исключения: в A12 «delete» идет после «delete», в A16 «delete» идет после «start», а в A19 «delete» идет после «delete». Как я могу подгруппировать только те «удаления», которые не идут после «ID». Итак, желаемый результат:

x     y
A12 delete
A16 delete
A19 delete

Ответы [ 2 ]

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

В base вы можете подмножество с логическим вектором, указывающим, когда delete не пришло после ID .

z[c(FALSE, z$y[-nrow(z)] != "ID" & z$y[-1] == "delete"),]
#     x      y
#12 A12 delete
#16 A16 delete
#19 A19 delete
2 голосов
/ 25 мая 2020

Вы можете использовать lag в dplyr:

library(dplyr)
df %>%  filter(y == 'delete' & lag(y) != 'ID')

#    x      y
#1 A12 delete
#2 A16 delete
#3 A19 delete

и эквивалент в data.table:

library(data.table)
setDT(df)[y == 'delete' & shift(y) != 'ID']
...