Р: Как сделать расчет за последние 2 года - PullRequest
0 голосов
/ 24 сентября 2019

Мой фрейм данных в R с 4 столбцами: ID, Дата, X, Y .Каждый идентификатор будет иметь много значений X & Y, а даты могут варьироваться от 100 до 1 года.Зернистость ежемесячная.

Я хотел бы сделать кумулятивную сумму X * Y для каждого удостоверения личности, но только за последние 2 года.Спасибо за вашу помощь, ребята.

ПЕРЕСМОТРЕН

Привет, например, у меня есть следующие данные

library(tidyverse)
data.frame = tibble(ID=c(1,1,1,1,1,2,2,2,2,2),
                    Year=c(2019, 2018, 2017, 2016, 2015, 2019, 2018, 2017, 2016, 2015),
                    X=c(1,2,3,4,5,6,7,8,9,10),
                    Y=c(11,12,13,14,15,16,17,18,19,20))
print(data.frame)

Я бы хотел, чтобы мой результат был

result = tibble(ID=c(1,2), sum = c(26,46))
result

Расчет для ID = 1 будет 1 + 2 + 11 + 12, а ID = 2 будет 6 + 7 + 16 + 17.Я хочу только сумму за последние 2 года.Спасибо

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Во-первых, вам не следует присваивать data.frame в качестве имени переменной, учитывая, что это уже объявленная функция data.frame ().Я буду использовать df впредь.

Вот решение для data.table.Он оценивает суммы X и Y за два самых больших года, записанных для каждого идентификатора.Следовательно, это также сработало бы, если бы для ID == 2 самые большие годы были, например, 2003 и 2004.

df = data.table(df)
mat = df[, .(
            Value = sum(X[Year %in% sort(Year, T)[1:2]]) + sum(Y[Year %in% sort(Year, T)[1:2]])
            ), keyby = ID]
> mat
   ID Value
1:  1    26
2:  2    46

Редактировать: Вы говорите X * Y, хотя в вашей выборке для выходных данных указано X + Y длякаждый из двух самых последних лет.Мой код оценивает X + Y и выдает указанные вами значения (26, 46).

0 голосов
/ 24 сентября 2019

Я не уверен на 100%, если я действительно понимаю, как выглядит ваш набор данных и что вы хотите, но вы можете расширить мой подход отсюда:

library(tidyverse)
library(chron)

set.seed(0)

# test dataset
tibble(ID=1:10,Date=Sys.Date()-c(0:9*365),X=sample(1:10),Y=sample(1:10)) %>%

  # ID     Date           X     Y
  # <int> <date>         <int> <int>
  # 1     1 2019-09-24     6     4
  # 2     2 2018-09-24     1     1
  # 3     3 2017-09-24     4     9
  # 4     4 2016-09-24     7     5
  # 5     5 2015-09-25     5     7
  # 6     6 2014-09-25     9     8
  # 7     7 2013-09-25     3     6
  # 8     8 2012-09-25     8     2
  # 9     9 2011-09-26    10     3
  # 10    10 2010-09-26    2    10

  # extract years
  mutate(Year=as.numeric(as.character(years(Date)))) %>%

  # most recent two years
  filter(Year %in% (as.numeric(as.character(years(Sys.Date())))-0:1)) %>%

  # your cumulative sum
  mutate(cum_var=cumsum(X*Y))

#      ID Date           X     Y  Year cum_var
#   <int> <date>     <int> <int> <dbl>   <int>
# 1     1 2019-09-24     5     6  2019      30
# 2     2 2018-09-24     9     4  2018      66

РЕДАКТИРОВАТЬ: На основе вашегоотредактируйте вот еще один пример.

df <- df %>%
  # reduce cols
  mutate(sum=X*Y) %>%
  select(-X,-Y) %>%

  # split per ID
  split(.,.$ID)

# identify two most recent years for each ID
lapply(df, function(x){
  x %>% mutate(recent=ifelse(Year %in% c(max(Year,na.rm=T)-c(0,1)),T,F))
}) %>%

  # bind to whole dataset again
  bind_rows() %>%

  # remove other years
  filter(recent) %>%
  select(-recent,-Year) %>%

  # summarise
  group_by(ID) %>%
  summarise_all(sum,na.rm=T)

#     ID   sum
#    <dbl> <dbl>
#  1   1    26
#  2   2    46

Однако я понятия не имею, что вы имеете в виду, имея в виду X*Y.Таким образом, я сначала сделал X * Y, а потом использовал обычный sum().Вам придется настроить эту часть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...