Извлекать строки при изменении значения в столбце с помощью dplyr r - PullRequest
4 голосов
/ 26 мая 2020

Я пытаюсь извлекать строки каждый раз, когда изменяется b:

   a b
1  1 A
2  4 A
3  5 A
4  3 B
5  3 B
6  2 B
7  4 B
8  6 A
9  2 A
10 4 C
11 1 C

Таким образом, я ожидаю, что результат будет:

  a b
1 1 A
2 3 B
3 6 A
4 4 C

Я думал при использовании функции задержки в dplyr для извлечения строк, в которых предыдущее значение b отличается, но не смог этого сделать ...

Любая помощь будет очень полезна !!

Ответы [ 3 ]

1 голос
/ 26 мая 2020

Один из вариантов может быть:

df %>%
 group_by(rleid = with(rle(b), rep(seq_along(lengths), lengths))) %>%
 slice(1) 

      a b     rleid
  <int> <chr> <int>
1     1 A         1
2     3 B         2
3     6 A         3
4     4 C         4
0 голосов
/ 26 мая 2020

Вариант с data.table

library(data.table)
setDT(df)[rowid(rleid(b)) == 1]
#   a b
#1: 1 A
#2: 3 B
#3: 6 A
#4: 4 C

данными

df <- structure(list(a = c(1L, 4L, 5L, 3L, 3L, 2L, 4L, 6L, 2L, 4L, 
1L), b = c("A", "A", "A", "B", "B", "B", "B", "A", "A", "C", 
"C")), class = "data.frame", row.names = c("1", "2", "3", "4", 
"5", "6", "7", "8", "9", "10", "11"))
0 голосов
/ 26 мая 2020

Если вы действительно хотите использовать lag и сравнивать различия в группе, вы можете сделать:

df %>%
  group_by(grp = cumsum(b != lag(b, default = first(b)))) %>%
  slice(1) 

В этом случае вы можете установить значение по умолчанию first(b) для нулевой разницы, когда оценка первой строки.

...