【问题标题】:How to apply function to QoQ Data如何将函数应用于 QoQ 数据
【发布时间】:2015-10-22 07:55:06
【问题描述】:

我有以下data.table:

library(data.table)
mydt <- data.table(DATE=c(201403,201406,201409,201412,201503,201506,201509), BALANCE = c(126,132,137,139,136,135,134), INCOME=c(288,298,303,303,299,297,292))

返回,

     DATE BALANCE INCOME
1: 201403     126    288
2: 201406     132    298
3: 201409     137    303
4: 201412     139    303
5: 201503     136    299
6: 201506     135    297
7: 201509     134    292

我想计算,例如,在 2015 年第三季度,该值将是 (136-126)/(288 - 126) = 0.06。完成后的结果如下:

     DATE BALANCE INCOME CHANGE
1: 201403     126    288     NA
2: 201406     132    298     NA
3: 201409     137    303     NA
4: 201412     139    303     NA
5: 201503     136    299  0.060
6: 201506     135    297  0.017
7: 201509     134    292 -0.016

你能推荐一下吗?

【问题讨论】:

  • 您已经尝试过什么了吗?为什么它不起作用?

标签: r data.table


【解决方案1】:

一种可能的解决方案是在DATE 的子字符串上运行这些计算(同时确保它是有序的)

mydt[order(DATE), 
     CHANGE := c(NA, round(diff(BALANCE)/(INCOME[1L] - BALANCE[1L]), 3L)), 
     by = substr(DATE, 5L, 6L)]
mydt
#      DATE BALANCE INCOME CHANGE
# 1: 201403     126    288     NA
# 2: 201406     132    298     NA
# 3: 201409     137    303     NA
# 4: 201412     139    303     NA
# 5: 201503     136    299  0.062
# 6: 201506     135    297  0.018
# 7: 201509     134    292 -0.018

你的计算似乎有点不对劲。此外,这仅适用于两年的数据,它需要概括你有很多年并且你想要滚动比较,但这会让你开始。

【讨论】:

  • 我认为一些shifts 应该足以概括它:mydt[ , CHANGE := (BALANCE-shift(BALANCE,type="lag"))/shift(INCOME-BALANCE,type="lag"), by=.(substr(DATE,5,6))] 不确定 OP 是否会在不知道该功能的情况下解决这个问题。
  • 不错的@Frank,shift 可能会做几年的工作。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 2020-09-04
  • 2019-04-24
  • 2019-06-18
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 2020-03-29
相关资源
最近更新 更多