我正在尝试使用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应该是什么?!这甚至可能吗?
任何人都可以告诉或指出我的答案?
提前致谢!
答案 0 :(得分: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
答案 1 :(得分:-2)
感谢Matthew和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))
感谢您的帮助!希望它会帮助别人!