首页 > 解决方案 > 如何使用最大(日期)和第二个最新(月)日期进行减法

问题描述

我正在尝试创建一个新变量,该变量等于最近一个月的值减去上个月的值(或前 3 个月等)。

一个快速的df:

country <- c("XYZ", "XYZ", "XYZ")
my_dates <- c("2021-10-01", "2021-09-01", "2021-08-01")
var1 <- c(1, 2, 3)
df1 <- country %>% cbind(my_dates) %>% cbind(var1) %>% as.data.frame()
df1$my_dates <- as.Date(df1$my_dates)
df1$var1 <- as.numeric(df1$var1)

例如,我尝试过(部分来自:如何从 R 中的日期中减去月份?

library(tidyverse)
df2 <- df1 %>%
 mutate(dif_1month = var1[my_dates==max(my_dates)] -var1[my_dates==max(my_dates) %m-% months(1)]

我还尝试了使用 lag() 的不同变体:

df2 <- df1 %>%
 mutate(dif_1month = var1[my_dates==max(my_dates)] - var1[my_dates==max(my_dates)-lag(max(my_dates), n=1L)])

关于如何在日期等于第二个最新观察值时获取变量值的任何建议?

感谢您的帮助,并为未包含任何数据而道歉。必要时可以编辑。

编辑了一些可能的答案:

#this 给了我最新日期的 var1 的值

df2 <- df1 %>% 
  mutate(value_1month = var1[my_dates==max(my_dates)])

#这给了我第二个最晚日期的日期

df2 <- df1 %>% 
  mutate(month1 = max(my_dates) %m-%months(1))

#这给了我第二个到最新的值

df2 <- df1 %>% 
  mutate(var1_1month = var1[my_dates==max(my_dates) %m-%months(1)])

#这给了我最新值和var1倒数第二个的区别

df2 <- df1 %>% 
  mutate(diff_1month = var1[my_dates==max(my_dates)] - var1[my_dates==max(my_dates) %m-%months(1)])

标签: rdatemaxsubset

解决方案


mutate要求输出与length原始数据的行数相同。当我们做子集时,长度是不同的。我们可能需要ifelsecase_when

library(dplyr)
library(lubridate)
df1 %>%
    mutate(diff_1month = case_when(my_dates==max(my_dates) ~ 
           my_dates %m-% months(1)))

注意:如果没有可重现的示例,则不清楚列类型和值


根据 OP 的更新,我们可以先做一个arrange,抓住最后两个 'val' 并得到difference

df1 %>% 
  arrange(my_dates) %>%
  mutate(dif_1month = diff(tail(var1, 2)))
    .   my_dates var1 dif_1month
1 XYZ 2021-08-01    3         -1
2 XYZ 2021-09-01    2         -1
3 XYZ 2021-10-01    1         -1

推荐阅读