0

我正在尝试使用 dplyr/tidyr 函数创建两个新变量,方法是使用来自先前但相关行的数据。在我的示例中,我有一个 data.frame,其中包含 ID、YEAR 和 AMOUNT 的数据(见下文)。

    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() )

xxx和yyy应该是什么?!这甚至可能吗?

任何人都可以告诉我或指出我的答案吗?

提前致谢!

4

2 回答 2

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
于 2015-03-19T19:00:30.580 回答
-2

谢谢马修和阿克伦!通过您的两种解决方案,我能够找到最终解决方案。

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))

谢谢你的帮助!希望它会帮助其他人!

于 2015-03-20T23:05:42.343 回答