У меня есть фрейм данных crsppofo
, который содержит ежемесячные финансовые данные с несколькими переменными. Для моего вопроса важны следующие вопросы:
PERMNO monthyear BetaShr
1: 85814 199501 0.5
2: 12345 199501 1.0
3: 85814 200002 1.5
4: 56789 200002 2.0
5: 12345 200002 2.5
"PERMNO"
описывает каждую отдельную акцию, "monthyear"
явно показывает год и месяц, а "BetaShr"
- это мой показатель риска, отсортированный по возрастанию.
Что я пытаюсь сделать, так это назначить децильные ранги (от 1 до 10) в соответствии с "BetaShr"
, но сгруппированные по "monthyear"
. Самый низкий ранг в децилях должен присваиваться самым низким 10% от "BetaShr"
каждого месяца. Результат должен выглядеть следующим образом:
PERMNO monthyear BetaShr BetaDecileRank
1: 85814 199501 0.5 1
2: 12345 199501 1.0 10
3: 85814 200002 1.5 1
4: 56789 200002 2.0 5
5: 12345 200002 2.5 10
Конечно, это просто упрощенный пример, в котором назначено только три дециля, чтобы дать вам пример моего желаемого результата (предполагая диапазон "BetaShr"
между 0,5 и 1,0 для 199501 и диапазон от 1,5 до 2,5 для 200002) , Вы поняли.
Благодаря исследованиям я придумал этот код:
library(purrr)
library(StatMeasures)
library(dplyr)
crsppofo <- crsppofo %>%
split(crsppofo$monthyear) %>%
map_df(~ mutate(., BetaDecileRank = decile(crsppofo$BetaShr)))
, приводящий к ошибке:
Error: Column `BetaDecileRank` must be length 2524 (the group size) or one, not 896935
Любая помощь по этой проблеме будет принята с благодарностью. Не стесняйтесь улучшать мой код или предлагать совершенно другой подход. Если вам нужна дополнительная информация, дайте мне знать через комментарии. Я также открыт для улучшений, касающихся моего вопроса и моего присутствия в SO, так как я только новичок на этом форуме и в R.