R: как посчитать / суммировать предыдущие значения для определенного идентификатора? - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть датафрейм df1 с информацией о количестве приобретений, совершенных компанией за определенный год.Мне нужно было бы

a) построить фиктивную переменную, если есть наблюдения, доступные три последовательных предыдущих года для каждой компании каждый год

b) если есть три последовательных предыдущих года для этой компании-года, затем суммируйте количество приобретений, совершенных за этот трехлетний период

df1 <- data.frame(ID=c('XXXX-1999','XXXX-2000', 'XXXX-2001', 'YYYY-1999', 
'YYYY-2000', 'ZZZZ-1999','ZZZZ-2000','ZZZZ-2001', 'ZZZZ-2002'),
              No.of.Transactions=c(1,0,2,2,2,4,1,0,3))

, где ID - это наблюдение за компанией в течение года.Желаемый результат ниже

# Desired output
# ID | No.of.Transactions | 3 preceding yrs available dummy? | 
No.of.Transactions during 3 preceding yrs
# XXXX-1999 1 0 N/A
# XXXX-2000 0 0 N/A
# XXXX-2001 2 1 3
# YYYY-1999 2 0 N/A
# YYYY-2000 2 0 N/A
# ZZZZ-1999 4 0 N/A
# ZZZZ-2000 1 0 N/A
# ZZZZ-2001 0 1 5
# ZZZZ-2002 3 1 4 

Так что, если "3 предыдущих года доступны, пустышка?"столбец принимает значение 1, тогда в последнем столбце должны быть указаны все транзакции для компании за основной и два предыдущих года.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вы можете использовать комбинацию ave и zoo::rollsumr.Если вам все еще нужна фиктивная переменная, вы можете легко создать ее из переменной суммы транзакции.

library(zoo)
df1$trans.sum <- with(df1, ave(No.of.Transactions, sub("(^.{4}).*", "\\1", ID), 
                           FUN = function(x) rollsumr(x, 3, fill = NA)))
df1
         ID No.of.Transactions trans.sum
1 XXXX-1999                  1        NA
2 XXXX-2000                  0        NA
3 XXXX-2001                  2         3
4 YYYY-1999                  2        NA
5 YYYY-2000                  2        NA
6 ZZZZ-1999                  4        NA
7 ZZZZ-2000                  1        NA
8 ZZZZ-2001                  0         5
9 ZZZZ-2002                  3         4
0 голосов
/ 28 февраля 2019

Как это?Я не слишком доволен битом three_year_trans = trans + lag(trans, 1) + lag(trans, 2), но это лучшее, что у меня получилось.

В случае, если это не очевидно, бит lag(year, 2, default = 0) == year - 2 гарантирует отсутствие пропусковлет (например, если компания XXXX имела XXXX-1999, XXXX-2001, XXXX-2002, итогов за 2002 год не будет, так как 2000 отсутствует.

library(dplyr)
library(tidyr)

df1 <- data.frame(ID=c('XXXX-1999','XXXX-2000', 'XXXX-2001', 'YYYY-1999', 
                       'YYYY-2000', 'ZZZZ-1999','ZZZZ-2000','ZZZZ-2001', 'ZZZZ-2002'),
                  trans=c(1,0,2,2,2,4,1,0,3))

df1 %>%
  separate(ID, c("company", "year"), "-") %>% 
  mutate(year = as.integer(year)) %>% 
  group_by(company) %>% 
  arrange(year) %>% 
  mutate(three_years_available = (lag(year, 2, default = 0) == year - 2) + 0,
         three_year_trans = if_else(three_years_available == 1,
                                    trans + lag(trans, 1) + lag(trans, 2),
                                    NA_real_)
  ) %>%
  ungroup() %>% 
  arrange(company, year)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...