【问题标题】:match values with different dates data.table匹配具有不同日期 data.table 的值
【发布时间】:2019-02-18 18:33:03
【问题描述】:

我有一个我似乎无法解决的问题。 问题如下:我的数据看起来像这样,它是一个 data.table:

    Code       Date Marketvalue CommonEquity FiscalYearEnd
 1: 13643N 2001-03-30       44.01        26761    2001-09-30
 2: 13643N 2001-04-30       35.21        26761    2001-09-30
 3: 13643N 2001-05-31       48.82        26761    2001-09-30
 4: 13643N 2001-06-29       31.74        26761    2001-09-30
 5: 13643N 2001-07-31       32.01        26761    2001-09-30
 6: 13643N 2001-08-31       20.27        26761    2001-09-30
 7: 13643N 2001-09-28       15.20        26761    2001-09-30
 8: 13643N 2001-10-31       18.14        18618    2002-09-30
 9: 13643N 2001-11-30       22.14        18618    2002-09-30
10: 13643N 2001-12-31       18.67        18618    2002-09-30
11: 13643N 2002-01-31       21.34        18618    2002-09-30
12: 13643N 2002-02-28       18.19        18618    2002-09-30
13: 13643N 2002-03-29       19.47        18618    2002-09-30
14: 13643N 2002-04-30       17.34        18618    2002-09-30
15: 13643N 2002-05-31       13.07        18618    2002-09-30
16: 13643N 2002-06-28        7.47        18618    2002-09-30
17: 13643N 2002-07-31        7.47        18618    2002-09-30
18: 13643N 2002-08-30        6.46        18618    2002-09-30
19: 13643N 2002-09-30        5.87        18618    2002-09-30
20: 13643N 2002-10-31        6.67        13728    2003-09-30
21: 13643N 2002-11-29        4.16        13728    2003-09-30
22: 13643N 2002-12-31        3.47        13728    2003-09-30
23: 13643N 2003-01-31        3.36        13728    2003-09-30
24: 13643N 2003-02-28        3.36        13728    2003-09-30
25: 13643N 2003-03-31        2.61        13728    2003-09-30
26: 13643N 2003-04-30        3.04        13728    2003-09-30
27: 13643N 2003-05-30        3.84        13728    2003-09-30
28: 13643N 2003-06-30        4.43        13728    2003-09-30
      Code       Date Marketvalue CommonEquity FiscalYearEnd

我想做的事:每年 t-1 年的每个 6 月我想将 t-1 财年的普通股与上一个 12 月的市场价值相匹配。 现在获得前一个 12 月的市值并不难:我使用 n=6L 的移位函数将 12 月的市值转移到 6 月,但我如何处理普通股呢? 例如:对于 2002 年 6 月,该财政年度的财政年度结束于 2002-09-30,但我需要在 t-1 结束的财政年度的普通股,在这种情况下为 2001-09-30(值为 26761,见 commonequity 列)。 有人可以帮我解决这个问题吗?不幸的是,我没有自己的代码来解决这个问题,因为我根本不知道如何解决财政年度结束问题:(

提前致谢。

编辑:

我包含了预期的输出:

      Code       Date Marketvalue CommonEquity FiscalYearEnd BEMERatio
 1: 13643N 2001-03-30       44.01        26761    2001-09-30        NA
 2: 13643N 2001-04-30       35.21        26761    2001-09-30        NA
 3: 13643N 2001-05-31       48.82        26761    2001-09-30        NA
 4: 13643N 2001-06-29       31.74        26761    2001-09-30        NA
 5: 13643N 2001-07-31       32.01        26761    2001-09-30        NA
 6: 13643N 2001-08-31       20.27        26761    2001-09-30        NA
 7: 13643N 2001-09-28       15.20        26761    2001-09-30        NA
 8: 13643N 2001-10-31       18.14        18618    2002-09-30        NA
 9: 13643N 2001-11-30       22.14        18618    2002-09-30        NA
10: 13643N 2001-12-31       18.67        18618    2002-09-30        NA
11: 13643N 2002-01-31       21.34        18618    2002-09-30        NA
12: 13643N 2002-02-28       18.19        18618    2002-09-30        NA
13: 13643N 2002-03-29       19.47        18618    2002-09-30        NA
14: 13643N 2002-04-30       17.34        18618    2002-09-30        NA
15: 13643N 2002-05-31       13.07        18618    2002-09-30        NA
16: 13643N 2002-06-28        7.47        18618    2002-09-30  1433.369
17: 13643N 2002-07-31        7.47        18618    2002-09-30        NA
18: 13643N 2002-08-30        6.46        18618    2002-09-30        NA
19: 13643N 2002-09-30        5.87        18618    2002-09-30        NA
20: 13643N 2002-10-31        6.67        13728    2003-09-30        NA
21: 13643N 2002-11-29        4.16        13728    2003-09-30        NA
22: 13643N 2002-12-31        3.47        13728    2003-09-30        NA
23: 13643N 2003-01-31        3.36        13728    2003-09-30        NA
24: 13643N 2003-02-28        3.36        13728    2003-09-30        NA
25: 13643N 2003-03-31        2.61        13728    2003-09-30        NA
26: 13643N 2003-04-30        3.04        13728    2003-09-30        NA
27: 13643N 2003-05-30        3.84        13728    2003-09-30        NA
28: 13643N 2003-06-30        4.43        13728    2003-09-30  5365.418
      Code       Date Marketvalue CommonEquity FiscalYearEnd BEMERatio

我们没有 2001 年 6 月的 bemeratio,因为我们的数据表中没有 2000 年 12 月的市场价值,而是 2002 年 6 月和 2003 年 6 月的市场价值。 基本上:每年6月:将上一个日历年结束的财政年度的普通股除以上一个12月的市值。在这个 2002 年 6 月的例子中:26761(2001 年结束的财政年度的普通股)除以 18.67(2001 年 12 月的市值)。

对于 2003 年 6 月:18618(截至 2002 年的财政年度的普通股)除以 3.47(2002 年 12 月的市值)

【问题讨论】:

  • 能否请您包含您提供的示例数据的预期输出。我很难理解你的散文解释。
  • 马上就做
  • 我试过这个,但我的问题是:我只是回到上一个财政年度的价值,但有时财政年度在当年的三月或四月结束,那么我需要回去' two' 值,表示上一个日历 (!) 年的三月或四月。

标签: r data.table finance


【解决方案1】:

这是使用data.table 的一种可能方法:

#calculate the prev fiscal year end date for self joining later
DT[!is.na(FiscalYearEnd), 
    PrevFiscalYearEnd := as.Date(vapply(FiscalYearEnd,
            function(x) seq(x, by="-1 year", length.out=2L)[2L],
            numeric(1L)), 
        origin="1970-01-01")]

ans <- DT[!is.na(FiscalYearEnd), BEMERatio := 
    #get the CommonEquity for each fiscal year end
    unique(DT[!is.na(FiscalYearEnd), .(Code, FiscalYearEnd, CommonEquity)])[
        #join to find the previous fiscal year end common equity
        DT[!is.na(FiscalYearEnd)], on=c("Code", "FiscalYearEnd"="PrevFiscalYearEnd")][,
            #calculate ratio (need to make sure data is complete so that shifting by 6 months is robust)
            CommonEquity / shift(Marketvalue, 6L)]
    ]

输出:

      Code       Date Marketvalue CommonEquity FiscalYearEnd PrevFiscalYearEnd BEMERatio
 1: 13643N 2001-03-30       44.01        26761    2001-09-30        2000-09-30        NA
 2: 13643N 2001-04-30       35.21        26761    2001-09-30        2000-09-30        NA
 3: 13643N 2001-05-31       48.82        26761    2001-09-30        2000-09-30        NA
 4: 13643N 2001-06-29       31.74        26761    2001-09-30        2000-09-30        NA
 5: 13643N 2001-07-31       32.01        26761    2001-09-30        2000-09-30        NA
 6: 13643N 2001-08-31       20.27        26761    2001-09-30        2000-09-30        NA
 7: 13643N 2001-09-28       15.20        26761    2001-09-30        2000-09-30        NA
 8: 13643N 2001-10-31       18.14        18618    2002-09-30        2001-09-30  760.0398
 9: 13643N 2001-11-30       22.14        18618    2002-09-30        2001-09-30  548.1565
10: 13643N 2001-12-31       18.67        18618    2002-09-30        2001-09-30  843.1317
11: 13643N 2002-01-31       21.34        18618    2002-09-30        2001-09-30  836.0200
12: 13643N 2002-02-28       18.19        18618    2002-09-30        2001-09-30 1320.2269
13: 13643N 2002-03-29       19.47        18618    2002-09-30        2001-09-30 1760.5921
14: 13643N 2002-04-30       17.34        18618    2002-09-30        2001-09-30 1475.2481
15: 13643N 2002-05-31       13.07        18618    2002-09-30        2001-09-30 1208.7173
16: 13643N 2002-06-28        7.47        18618    2002-09-30        2001-09-30 1433.3690
17: 13643N 2002-07-31        7.47        18618    2002-09-30        2001-09-30 1254.0300
18: 13643N 2002-08-30        6.46        18618    2002-09-30        2001-09-30 1471.1930
19: 13643N 2002-09-30        5.87        18618    2002-09-30        2001-09-30 1374.4735
20: 13643N 2002-10-31        6.67        13728    2003-09-30        2002-09-30 1073.7024
21: 13643N 2002-11-29        4.16        13728    2003-09-30        2002-09-30 1424.4836
22: 13643N 2002-12-31        3.47        13728    2003-09-30        2002-09-30 2492.3695
23: 13643N 2003-01-31        3.36        13728    2003-09-30        2002-09-30 2492.3695
24: 13643N 2003-02-28        3.36        13728    2003-09-30        2002-09-30 2882.0433
25: 13643N 2003-03-31        2.61        13728    2003-09-30        2002-09-30 3171.7206
26: 13643N 2003-04-30        3.04        13728    2003-09-30        2002-09-30 2791.3043
27: 13643N 2003-05-30        3.84        13728    2003-09-30        2002-09-30 4475.4808
28: 13643N 2003-06-30        4.43        13728    2003-09-30        2002-09-30 5365.4179
      Code       Date Marketvalue CommonEquity FiscalYearEnd PrevFiscalYearEnd BEMERatio

如果您真的需要在 6 月之外的几个月成为 NA:

ans[month(Date)!=6L, BEMERatio := NA_real_]

输出:

      Code       Date Marketvalue CommonEquity FiscalYearEnd PrevFiscalYearEnd BEMERatio
 1: 13643N 2001-03-30       44.01        26761    2001-09-30        2000-09-30        NA
 2: 13643N 2001-04-30       35.21        26761    2001-09-30        2000-09-30        NA
 3: 13643N 2001-05-31       48.82        26761    2001-09-30        2000-09-30        NA
 4: 13643N 2001-06-29       31.74        26761    2001-09-30        2000-09-30        NA
 5: 13643N 2001-07-31       32.01        26761    2001-09-30        2000-09-30        NA
 6: 13643N 2001-08-31       20.27        26761    2001-09-30        2000-09-30        NA
 7: 13643N 2001-09-28       15.20        26761    2001-09-30        2000-09-30        NA
 8: 13643N 2001-10-31       18.14        18618    2002-09-30        2001-09-30        NA
 9: 13643N 2001-11-30       22.14        18618    2002-09-30        2001-09-30        NA
10: 13643N 2001-12-31       18.67        18618    2002-09-30        2001-09-30        NA
11: 13643N 2002-01-31       21.34        18618    2002-09-30        2001-09-30        NA
12: 13643N 2002-02-28       18.19        18618    2002-09-30        2001-09-30        NA
13: 13643N 2002-03-29       19.47        18618    2002-09-30        2001-09-30        NA
14: 13643N 2002-04-30       17.34        18618    2002-09-30        2001-09-30        NA
15: 13643N 2002-05-31       13.07        18618    2002-09-30        2001-09-30        NA
16: 13643N 2002-06-28        7.47        18618    2002-09-30        2001-09-30  1433.369
17: 13643N 2002-07-31        7.47        18618    2002-09-30        2001-09-30        NA
18: 13643N 2002-08-30        6.46        18618    2002-09-30        2001-09-30        NA
19: 13643N 2002-09-30        5.87        18618    2002-09-30        2001-09-30        NA
20: 13643N 2002-10-31        6.67        13728    2003-09-30        2002-09-30        NA
21: 13643N 2002-11-29        4.16        13728    2003-09-30        2002-09-30        NA
22: 13643N 2002-12-31        3.47        13728    2003-09-30        2002-09-30        NA
23: 13643N 2003-01-31        3.36        13728    2003-09-30        2002-09-30        NA
24: 13643N 2003-02-28        3.36        13728    2003-09-30        2002-09-30        NA
25: 13643N 2003-03-31        2.61        13728    2003-09-30        2002-09-30        NA
26: 13643N 2003-04-30        3.04        13728    2003-09-30        2002-09-30        NA
27: 13643N 2003-05-30        3.84        13728    2003-09-30        2002-09-30        NA
28: 13643N 2003-06-30        4.43        13728    2003-09-30        2002-09-30  5365.418
      Code       Date Marketvalue CommonEquity FiscalYearEnd PrevFiscalYearEnd BEMERatio

【讨论】:

  • 谢谢你,我试图分析我的问题,但我得到了错误:`seq.int(r1$year, by = by, length.out = length.out) 中的错误: 'from' 必须是代码第一部分中的有限数。我试图找出问题所在,您有什么想法吗?
  • 你能不能做一个DT[, unique(FiscalYearEnd)] 看看有没有NAs
  • 是的,有。很抱歉对此不够清楚。除了代码列和日期列之外,我在所有列中都有 NA。
  • 增加了对 NA 财政年度结束的处理。你能再试一次吗?
  • 最佳情况:如果我没有以 t-1 结尾的财政年度结束数据,那么我不需要该公司在 t 年的 BEME 比率。如果稍后我有财政年度结束数据,那么它们应该包括在内。
猜你喜欢
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
相关资源
最近更新 更多