Перенос наблюдений вперед на n строк по группам - PullRequest
0 голосов
/ 10 октября 2018

У меня есть такие данные, которые сгруппированы по 'orgid':

orgid date    type counter
12345 1-1-17  sale  3
12345 1-2-17  NA   NA
12345 1-3-17  NA   NA
78945 1-1-17  NA   NA
78945 1-2-17  free 2
78945 1-3-17  NA   NA

Для каждой 'orgid', я хотел бы "перетащить" N-1 строки 'type', гдеN определяется столбцом 'counter'.Результат должен выглядеть следующим образом:

orgid date    type counter
12345 1-1-17  sale   3
12345 1-2-17  sale   NA
12345 1-3-17  sale   NA
78945 1-1-17  NA     NA
78945 1-2-17  free   2
78945 1-3-17  free   NA

Я считаю, что могу использовать na.locf в пакете zoo, но мне не удалось взломать код.Есть идеи?

1 Ответ

0 голосов
/ 10 октября 2018

Я не думаю, что вы можете использовать zoo::na.locf для этого, я не думаю, что это учитывает ограничивающий фактор. (Спасибо Хенрику за то, что выправили меня!)

Два решения, и я уверен, что data.table гуру может добавить соответствующий третий:

База R

do.call("rbind.data.frame",
        lapply(split(dat, cumsum(!is.na(dat$type))),
               function(d) within(d, type[seq_len(min(nrow(d), counter[1]))] <- type[1])
               ))

dplyr

library(dplyr)
dat %>%
  mutate(grp = cumsum(!is.na(type))) %>%
  group_by(grp) %>%
  mutate(type = if_else(row_number() <= counter[1], type[1], type)) %>%
  ungroup() %>%
  select(-grp)

Данные

dat <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
orgid date    type counter
12345 1-1-17  sale  3
12345 1-2-17  NA   NA
12345 1-3-17  NA   NA
78945 1-1-17  NA   NA
78945 1-2-17  free 2
78945 1-3-17  NA   NA')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...