Как обозначить последовательность одинаковых значений - PullRequest
0 голосов
/ 28 сентября 2019

Я хотел бы добавить столбец идентификатора для группы, но увеличить идентификатор на 1, когда значение повторяется после получения какого-либо другого значения в интервале.Например, рассмотрим следующий столбец со значениями

Unique    Value
 jack       A
 jack       A
 jack       A
 bill       B
 bill       B
 rick       C
 jack       D
 jack       D
 bill       A
 rick       C
 jack       A
 jack       A
 jack       A

Предполагаемый результат:

    Unique    Value      ID
     jack       A        1
     jack       A        1
     jack       A        1
     bill       B        1
     bill       B        1
     rick       C        1
     jack       D        1
     jack       D        1
     bill       A        1
     rick       A        1
     jack       A        2
     jack       A        2
     jack       A        2 

Я пробовал следующий код из пакета data.table:

DT[, ID := sequence(.N), by = Value]

Это помогает только при добавлении идентификаторов в группы, и идентификатор сбрасывается на 1 для следующего вхождения.Здесь я хотел бы увеличить его на 1

Спасибо за помощь заранее.Любые дополнительные ссылки для понимания приведенного выше примера высоко ценятся.

Конечное намерение - получить объединенный столбец, который будет читать что-то вроде jack_a_1 и jack_a_2, так что этот столбец будет действовать как идентификатор длядальнейшие шаги.

Ответы [ 2 ]

3 голосов
/ 28 сентября 2019

Вы можете попробовать использовать shift и cumsum в data.table для достижения этого:

library(data.table)
dt <- read.table(text = "Value
A
A
A
B
B
C
A
A", header = TRUE)
dt <- data.table(dt)

dt[, change := shift(Value) != Value ]
dt[is.na(change), change := TRUE]
dt[, res := cumsum(change), by = Value]
#       Value  change res
# 1:     A     TRUE   1
# 2:     A     FALSE  1
# 3:     A     FALSE  1
# 4:     B     TRUE   1
# 5:     B     FALSE  1
# 6:     C     TRUE   1
# 7:     A     TRUE   2
# 8:     A     FALSE  2

ОБНОВЛЕНИЕ

Для достижения этой цели в течение дополнительного временистолбец, на основе обновленного примера:

dt[, change := shift(Value) != Value, by = Unique]
dt[is.na(change), change := TRUE]
dt[, res := cumsum(change), by = .(Value, Unique)]
0 голосов
/ 29 сентября 2019

Вот один из способов использования dplyr.Мы вместе paste Unique и Value столбец (col), создаем инкрементный счетчик для каждого изменения в col, group_by Unique и Value вместе и создаем столбец ранжирования с dense_rank.

library(dplyr)

df %>%
  mutate(col = paste(Unique, Value, sep ="_"), 
         group = cumsum(col != lag(col, default = first(col)))) %>%
  group_by(Unique, Value) %>%
  mutate(ID = dense_rank(group)) %>%
  select(-group)

#   Unique Value  col      ID
#   <fct> <fct>  <chr>  <int>
# 1 jack   A     jack_A     1
# 2 jack   A     jack_A     1
# 3 jack   A     jack_A     1
# 4 bill   B     bill_B     1
# 5 bill   B     bill_B     1
# 6 rick   C     rick_C     1
# 7 jack   D     jack_D     1
# 8 jack   D     jack_D     1
# 9 bill   A     bill_A     1
#10 rick   A     rick_A     1
#11 jack   A     jack_A     2
#12 jack   A     jack_A     2
#13 jack   A     jack_A     2

При необходимости вы можете удалить столбец col в конечном выводе.

данные

df <- structure(list(Unique = structure(c(2L, 2L, 2L, 1L, 1L, 3L, 2L, 
2L, 1L, 3L, 2L, 2L, 2L), .Label = c("bill", "jack", "rick"), class = "factor"), 
Value = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 4L, 4L, 1L, 1L, 
1L, 1L, 1L), .Label = c("A", "B", "C", "D"), class = "factor")), row.names = c(NA, 
-13L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...