Фильтр по диапазону дат в отдельном фрейме данных - R - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь составить уникальный список инвесторов, которые держали целевые акции в течение последних 6 месяцев после слияния.

У меня есть два отдельных фрейма данных, которые я использую для этой цели: - df1 содержит идентификатор инвестора, идентификатор акции, дату и портфельные запасы акций.- df2 содержит идентификатор акции покупателя, идентификатор целевой акции и дату слияния.

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
...             ...             ...

Для каждого слияния я хочу отфильтровать тех инвесторов, которые держали любой объем целевой акции выше 0 в пределах6 месяцев до слияния.Неважно, что портфельные вклады инвесторов на дату слияния равны 0, если они держали положительный объем в течение 6 месяцев до него.

Все, что мне нужно, - это список тех инвесторов, которые имеютудерживал целевой запас, как показано ниже.Я буду использовать этот список в качестве фильтра для более крупного набора данных позже.

investor
629
664
…

Инвестор 629 выбран потому, что у нее было положительное владение акцией 10 в течение 6 месяцев до даты слияния.Инвестор 664 выбирается исходя из того, что он владеет обеими акциями 10 и 12. Инвестор 1020 не выбран, поскольку, хотя у него есть акция 10, это не произойдет в течение 6 месяцев с даты слияния.

1 Ответ

0 голосов
/ 27 апреля 2019

Прежде всего, я merge два набора данных. Объединение их означает выполнение операции, подобной соединению.

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

df3 - это объединенный набор данных. Он содержит все df1 и все df2 столбцы и строки. Я сопоставил два набора данных, где выполняется условие stock = target stock. Пожалуйста, ознакомьтесь с функцией merge для получения дополнительной информации (просто наберите ?merge в консоли R).

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

Затем я добавляю новый столбец. Этот новый столбец вычитает 6 месяцев из date of merger: я буду использовать его, чтобы проверить, какие строки соответствуют условию

"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: я добавил их в качестве промежуточных шагов, чтобы облегчить отладку / понимание:)
  • Я бы предложил выполнять такие операции (в основном, фильтрацию данных) из БД с использованием SQL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...