我正在尝试生成在合并发生后的六个月内持有目标股票的独特投资者列表。
我为此使用了两个单独的数据帧: -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个月之内。
答案 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"])
注释
tmp
,df3
和df4
之类的无用的对象:我将它们添加为中间步骤,以使其更易于调试/理解:)