使用单独数据框中的日期范围进行过滤-R

时间:2019-04-26 09:37:24

标签: r

我正在尝试生成在合并发生后的六个月内持有目标股票的独特投资者列表。

我为此使用了两个单独的数据帧: -df1包含投资者ID,股票ID,日期和股票投资组合持有量。 -df2包含收购方股票ID,目标股票ID和合并日期。

investor stock  date            portfolio holdings
629      10     01/01/1990      100
629      10     02/01/1990      100
629      10     03/01/1990      70
629      10     04/01/1990      50
629      10     05/01/1990      0
629      10     06/01/1990      0
664      10     04/01/1990      100
664      10     05/01/1990      100
664      10     06/01/1992      100
664      12     10/10/1992      100
664      12     11/10/1992      100
1020     10     12/12/1995      50
1020     10     13/12/1995      25
1020     10     14/12/1995      25
1020     10     15/12/1995      0
...      ...    ...             ...
acquirer stock  target stock    date of merger
100             10              06/01/1990
101             12              10/10/1992
102             14              15/12/1995
...             ...             ...

对于每笔合并,我想过滤掉那些在合并发生前的6个月内持有任何数量大于0的目标股票的投资者。如果他们在合并之日前六个月内持股量为正,那么并购日的投资组合持股为0并不重要。

我所需要的是持有目标股票的那些投资者的清单,如下所示。稍后,我将使用此列表作为更大数据集的过滤器。

investor
629
664
…

选择投资者629是因为她在合并日期之前的6个月内拥有正面的股票10。根据她持有的股票10和12来选择投资者664。未选择投资者1020,因为尽管她持有股票10,但不在合并日期的6个月之内。

1 个答案:

答案 0 :(得分:0)

首先,我merge两个数据集。合并它们意味着执行类似join的操作。

df3 = merge (
    df1, df2,
    by.x = "stock", by.y = "target stock"
)

df3是合并的数据集。 它包含所有df1和所有df2列和行。我匹配了满足条件stock = target stock的两个数据集。 请查看merge函数以获取更多详细信息(只需在R控制台中键入?merge)。

df4 = df3

tmp = sapply(
    df4[, "date of merger"], 
    function(d) as.Date(seq(d, length = 2, by = "-6 months")[2])
)

df4[, "date of merger start"] = as.Date(tmp, origin = "1970-01-01")

df4

然后添加一个新列。新列从date of merger中减去了6个月:我将用它来检查哪些行符合条件

"date of merger -6 months" <= "date" <= "date of merger"

我只保留满足条件的行:

df5 = subset(
    df4, "portfolio holdings" > 0 & "date" <= "date of merger" & "date of merger start" <= "date"
)

df5

请查看subset帮助(?subset)以获得更多详细信息。

您声明仅对investor个不同的值感兴趣:

unique(df5[, "investor"])

注释

  • 我在测试代码时遇到了一些问题,因此可能需要一些修复,但这是我个人解决问题的方式
  • 您可能会发现许多不同的解决方案,我无法保证您这是最好的解决方案
  • 应该对代码进行优化(避免创建诸如tmpdf3df4之类的无用的对象:我将它们添加为中间步骤,以使其更易于调试/理解:)
  • 我建议使用SQL从数据库中进行此类操作(基本上是数据过滤)