【问题标题】:Dplyr mutate does not condition correctly on separate (date) columnDplyr mutate 在单独的(日期)列上没有正确条件
【发布时间】:2023-01-27 18:45:53
【问题描述】:

我有一个时间序列数据集,我想在其中引用前一年的值(如果存在)。因此,我创建了一个包含我所指日期的辅助列,并期望代码从该确切年份检索值。然而,这并没有发生,而是它在所有行中检索相同的值,对应于第一个可能的年份。

我使用以下代码

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 如何使用条件?

【问题讨论】:

  • 您没有正确使用方括号中的条件。你能描述一下你想让最后的mutate()做什么吗?
  • 首先,您的代码中根本不需要 group_by()。其次,问题不在于mutate,只是矢量化子集没有做你想做的事。相反,您需要match

标签: r dplyr


【解决方案1】:

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

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

这给出了期望的结果。

【讨论】:

    【解决方案2】:

    要获得预期结果,您应该使用左连接:

    dataset_calc %>% 
      left_join(select(dataset_calc, values, dates), by = c(yoy = "dates"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多