Как отсортировать фрейм данных в группы на основе нескольких критериев - PullRequest
1 голос
/ 25 мая 2019

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

Я уже изучил функцию split (), но не нашел способа разделить свои данные за каждый месяц.

Это образец моего набора данных. У меня есть большой набор данных за этой выборкой (22 000 000 строк, содержащих данные за 30 лет).

         date cit
1  1990-01-01   1
2  1990-01-01   2
3  1990-01-01   3
4  1990-01-01   4
5  1990-01-01   5
6  1990-01-01   6
7  1990-01-01   7
8  1990-01-01   8
9  1990-01-01   9
10 1990-01-01  10
11 1990-02-01  11
12 1990-02-01  12
13 1990-02-01  13
14 1990-02-01  14
15 1990-02-01  15
16 1990-02-01  16
17 1990-02-01  17
18 1990-02-01  18
19 1990-02-01  19
20 1990-02-01  20

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

         date  cit portfolio
1  1990-01-01  1.5         1
2  1990-01-01  3.5         2
3  1990-01-01  5.5         3
4  1990-01-01  7.5         4
5  1990-01-01  9.5         5
6  1990-01-01 11.5         1
7  1990-01-01 13.5         2
8  1990-01-01 15.5         3
9  1990-01-01 17.5         4
10 1990-01-01 19.5         5

Любая помощь очень ценится. Большое вам спасибо!

1 Ответ

1 голос
/ 25 мая 2019

Нет ничего приятного в этом решении, но, возможно, оно поможет, пакет lubridate полезен для извлечения месяца для разделения данных.

library(tidyverse);library(magrittr);library(lubridate)
df <- list("date" = c(rep("1990-01-01",10),rep("1990-02-01",10)),
              "cit"=1:20) %>% as.data.frame()
df$date %<>% as.Date()

df.res <-
    split(df, df$date) %>%
        map_df(~{
            .x %>% 
            mutate(portfolio = cut(cit, breaks = 5, labels = 1:5)) %>%
            group_by(portfolio) %>% 
            summarise(meanCit = mean(cit)) %>%
            transmute(year= year(.x$date)[1],
                   month= month(.x$date)[1],
                   meanCit,
                   portfolio)
            })

df.res
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...