2015-03-19 2 views
0

Я пытаюсь создать две новые переменные, используя функции dplyr/tidyr, используя данные из предыдущих, но связанных строк. В моем примере у меня есть data.frame с данными для ID, YEAR и AMOUNT (см. Ниже).R dplyr/tidyr: «мутировать» новые столбцы с данными других наблюдений

ID YEAR AMOUNT 
    A 2000 4 
    B 2000 4 
    A 2001 2 
    B 2001 3 
    A 2002 3 
    B 2002 1 

Я хочу создать последние два столбца динамически (см ниже) с использованием dplyr/tidyr (я нашел способ делать это регулярно, но мне было бы интересно узнать, как сделать это в последней версии в dplyr/tidyr).

ID YEAR AMOUNT YtY_VARIANCE Y_VARIANCE 
    A 2000 4   0    0 
    B 2000 4   0    0 
    A 2001 2   -2    -2 
    B 2001 3   -1    -1 
    A 2002 3   +1    -1 
    B 2002 1   -2    -3 

Где YtY_VARIANCE получается путем вычитания суммы из предыдущего года и Y_VARIANCE получается путем вычитания суммы из первого года (всегда).

я ожидал бы такой код:

raw_data %>% 
     group_by(ID, YEAR) # Not even sure if that's required?!? 
     mutate(YtY_VARIANCE = xxx(), Y_VARIANCE = yyy()) 

Что должно быть ххх и ууу ?! Возможно ли это?

Любой может мне ответить или ответить?

Заранее благодарен!

ответ

2

Вы можете попробовать

raw_data %>% 
     group_by(ID) %>% 
     mutate(YtY_VARIANCE=AMOUNT-lag(AMOUNT), 
     YtY_VARIANCE=replace(YtY_VARIANCE, which(is.na(YtY_VARIANCE)), 0), 
     Y_VARIANCE=AMOUNT-AMOUNT[1L]) 
#  ID YEAR AMOUNT YtY_VARIANCE Y_VARIANCE 
#1 A 2000  4   0   0 
#2 B 2000  4   0   0 
#3 A 2001  2   -2   -2 
#4 B 2001  3   -1   -1 
#5 A 2002  3   1   -1 
#6 B 2002  1   -2   -3 
+0

plus один. Вы также можете сделать 'YtY_VARIANCE = pmax (AMOUNT-lag (AMOUNT), 0, na.rm = TRUE)' и 'Y_VARIANCE = AMOUNT-first (AMOUNT)'. –

+0

@MatthewPlourde Спасибо, я попробовал строку 'pmax', но он дает' [1] 0 0 0 0 1 0' Я использую 'dplyr_0.4.1.9000' – akrun

-2

Спасибо Мэтью и Akrun! Благодаря вашим решениям я смог найти окончательное решение.

Предлагаемое решение Akrun работало в моей простой модели, но у меня все еще возникали проблемы в моей более крупной/сложной/окончательной модели. Окончательным решением, которое я закончил, было объединение обоих:

raw_data %>% 
     group_by(ID) %>% 
     arrange(YEAR) %>% 
     mutate(YtY_VARIANCE=AMOUNT-lag(AMOUNT), 
      YtY_VARIANCE=replace(YtY_VARIANCE, which(is.na(YtY_VARIANCE)), 0), 
      Y_VARIANCE=AMOUNT-first(AMOUNT)) 

Спасибо за помощь! И, надеюсь, это поможет другим!

Смежные вопросы