r - 如何使用最大(日期)和第二个最新(月)日期进行减法
问题描述
我正在尝试创建一个新变量,该变量等于最近一个月的值减去上个月的值(或前 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)])
解决方案
mutate
要求输出与length
原始数据的行数相同。当我们做子集时,长度是不同的。我们可能需要ifelse
或case_when
library(dplyr)
library(lubridate)
df1 %>%
mutate(diff_1month = case_when(my_dates==max(my_dates) ~
my_dates %m-% months(1)))
注意:如果没有可重现的示例,则不清楚列类型和值
根据 OP 的更新,我们可以先做一个arrange
,抓住最后两个 'val' 并得到diff
erence
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
推荐阅读
- reactjs - React 和 Flask POST 请求错误:CORS 策略:没有“Access-Control-Allow-Origin”
- django - 从 Stripe 付款后如何将客户重定向到成功页面?
- git - 将 ssh 添加到 gitlab 时权限被拒绝
- f# - F# 无法从 TestFixtureSource 和具有多参数构造函数的类创建 NUnit 测试
- python - 如何将 discord.py 帮助命令放入嵌入中?
- python - 在多索引数据帧(熊猫)中生成组合方式
- python - 下面的 Win Error 2 是在带有 Python 3 的 Windows 8 上使用 Sublime Text 时收到的完整消息
- github - 从纯粹的技术角度来看,github 是否可以从公共存储库中删除我的电子邮件地址?
- django - 在 django 中使用多个参数过滤查询
- verilog - 什么是添加延迟的正确方法,例如。74HCT151,verilog 型号,所以它与数据表准确吗?