Назначьте идентификатор группы, начинающийся с 0 и заканчивающийся 1 в R - PullRequest
0 голосов
/ 31 марта 2020

У меня есть следующий набор данных

DT <- data.drame(v1 = c(0,0,0,1,0,0,1))

Я хочу создать идентификатор, совокупно остановленный со значением 1.

Идентификатор должен быть

ID<-c(1,2,3,4,1,2,3)

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Если вы используете dplyr, это поможет.

DT = data.frame(v1 = c(0,0,0,1,0,0,1))

DT %>% 
  dplyr::mutate(rno = row_number()) %>% 
  dplyr::mutate(group = ifelse(v1 == 0, NA, rno)) %>% 
  tidyr::fill(group, .direction = "up") %>% 
  dplyr::group_by(group) %>% 
  dplyr::mutate(ID = row_number()) %>% 
  dplyr::ungroup() %>% 
  dplyr::select(v1, ID)
0 голосов
/ 31 марта 2020

В базе R мы можем использовать ave:

with(DT, ave(v1, c(0, cumsum(v1)[-length(v1)]), FUN = seq_along))
#[1] 1 2 3 4 1 2 3

В dplyr мы можем использовать lag для создания групп и назначения номера строки в каждой группе.

library(dplyr)
DT %>% group_by(gr = lag(cumsum(v1), default = 0)) %>% mutate(ID = row_number())

и мы можем использовать тот же лог c в data.table:

library(data.table)
setDT(DT)[, ID := seq_len(.N), shift(cumsum(v1), fill = 0)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...