Группировать кадр данных на основе разрывов последовательности в столбце? - PullRequest
4 голосов
/ 27 марта 2019

У меня есть data.frame, в котором есть столбец целочисленных значений. Мне нужно сформировать группирующую переменную, которая определяет разрывы последовательности в этом столбце. Например, я мог бы создать еще один столбец с восходящими целыми числами, который добавляет его всякий раз, когда значение исходного столбца не превышает его запаздывающее значение. Как мне это сделать?

например. если у меня есть data.frame, как это:

df <- data.frame(A = c(1,2,4,6,78,3,56,78,23))

Мне нужен способ создать новую таблицу со столбцом B:

df$B <- c(1,1,1,1,1,2,2,2,3)

Я пытался, например, с dplyr:

df %>% mutate(B = 1,
              B = case_when(A < lag(A), B + 1))

Это не совсем правильно.

Ответы [ 2 ]

5 голосов
/ 27 марта 2019

Мы можем использовать cumsum и diff, которые будут увеличивать значение каждый раз, когда последовательность нарушается

cumsum(c(-1, diff(df$A)) < 0)
#[1] 1 1 1 1 1 2 2 2 3

Мы также можем интегрироваться в dplyr цепочку, чтобы получить

library(dplyr)

df %>%
  mutate(B = cumsum(c(-1, diff(A)) < 0))

#   A B
#1  1 1
#2  2 1
#3  4 1
#4  6 1
#5 78 1
#6  3 2
#7 56 2
#8 78 2
#9 23 3

Хакерский способ использования lag может быть

df %>%
  mutate(B = cumsum(c(-1, (A - lag(A))[-1]) < 0))
1 голос
/ 27 марта 2019

Или используя data.table

library(data.table)
setDT(df)[, B := cumsum(A - shift(A, fill = first(A)) < 0) + 1][]
#    A B
#1:  1 1
#2:  2 1
#3:  4 1
#4:  6 1
#5: 78 1
#6:  3 2
#7: 56 2
#8: 78 2
#9: 23 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...