R: Оставить строки в df на основе заданного условия c - PullRequest
0 голосов
/ 11 апреля 2020

Предположим, что df такой:

X   VAL
1    a
2    b
5    a
9    b
32   a
33   b
40   b
42   a

Я хочу отбросить все строки, где X [i + 1] -X [i]! = 1 , где я сравниваю сгруппированные пары (сначала я смотрю на строки 1-2, затем на строки 3-4 и т. д. c.), и в то же время в первой строке пары должно быть VAL = a и VAL = b во втором ряду пары. Результирующий df должен выглядеть следующим образом:

X   VAL
1    a
2    b
32   a
33   b

Любая помощь приветствуется. Спасибо!

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Если вы смотрите на пары строк, вы можете group_by 2 строки за раз и filter (сохранять) строки, где разница равна 1.

Редактировать : Ответ также проверяет, чтобы строка first в паре была 'a', а строка last в паре - 'b'.

library(tidyverse)

df %>%
  group_by(cumsum(row_number() %% 2)) %>%
  filter(diff(X) == 1 && first(VAL) == 'a' && last(VAL) == 'b') %>%
  ungroup() %>%
  select(X, VAL)

Выход

# A tibble: 4 x 2
      X VAL  
  <dbl> <chr>
1     1 a    
2     2 b    
3    32 a    
4    33 b

Данные

df <- structure(list(X = c(1, 2, 5, 9, 32, 33, 40, 42), VAL = c("a", 
"b", "a", "b", "a", "b", "b", "a")), class = "data.frame", row.names = c(NA, 
-8L))
1 голос
/ 11 апреля 2020

Просто сделай:

df[c(diff(df$x),0) == 1, ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...