Dplyr突变未在单独(日期)列上正确调节

5f0d552i  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(119)

我有一个时间序列数据集,我想在其中引用上一年的值(如果存在的话)。因此,我创建了一个包含所引用日期的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如何使用条件?

ztigrdn8

ztigrdn81#

您可以在新列yoy上使用原始日期执行left_join,以查找每一年的相应值:

final <- dataset_calc  %>% 
  left_join(dataset_calc %>% select(values, dates), by = c('yoy' = 'dates'))

这就得到了所需的结果。
如果要将操作合并到现有管道中,可以使用eval(.)引用中间结果并执行某种自连接:

dataset_calc <- dataset %>% 
  group_by(names) %>% 
  mutate(yoy=case_when(dates>=dmy("01/01/2011") ~ dates-years(1),
                       TRUE ~ dmy("01/01/2010"))) %>% 
  ungroup() %>% 
  left_join(eval(.)  %>% select(values, dates), by = c('yoy' = 'dates'))

相关问题