我有一个时间序列数据集,我想在其中引用上一年的值(如果存在的话)。因此,我创建了一个包含所引用日期的helper列,并期望代码从该确切年份检索值。然而,这并没有发生,而是在所有行中检索相同的值,对应于第一个可能的年份。
我使用以下代码
library(dplyr)
library(lubridate)
dataset <- data.frame(names=c("a","a","a","a","a","a"),
values=c(2,3,4,5,6,7),
dates=dmy(c("01/01/2010","01/01/2011","01/01/2012","01/01/2013","01/01/2014","01/01/2015")))
dataset_calc <- dataset %>%
group_by(names) %>%
mutate(yoy=case_when(dates>=dmy("01/01/2011") ~ dates-years(1),
TRUE ~ dmy("01/01/2010"))) %>%
ungroup()
final <- dataset_calc %>%
mutate(yoyval= values[dates==yoy])
但得到这个结果:
names values dates yoy yoyval
<chr> <dbl> <date> <date> <dbl>
1 a 2 2010-01-01 2010-01-01 2
2 a 3 2011-01-01 2010-01-01 2
3 a 4 2012-01-01 2011-01-01 2
4 a 5 2013-01-01 2012-01-01 2
5 a 6 2014-01-01 2013-01-01 2
6 a 7 2015-01-01 2014-01-01 2
我希望得到以下内容:
names values dates yoy yoyval
<chr> <dbl> <date> <date> <dbl>
1 a 2 2010-01-01 2010-01-01 2
2 a 3 2011-01-01 2010-01-01 2
3 a 4 2012-01-01 2011-01-01 3
4 a 5 2013-01-01 2012-01-01 4
5 a 6 2014-01-01 2013-01-01 5
6 a 7 2015-01-01 2014-01-01 6
我没有正确地使用方括号中的条件,还是我误解了mutate如何使用条件?
1条答案
按热度按时间ztigrdn81#
您可以在新列yoy上使用原始日期执行left_join,以查找每一年的相应值:
这就得到了所需的结果。
如果要将操作合并到现有管道中,可以使用
eval(.)
引用中间结果并执行某种自连接: