2015-02-12 2 views
3

У меня есть список CRSP котировок акций, как следоватьраспространения() в tidyr

PERMNO date  TICKER RETX 
1 10138 2007-01-03 TROW 0.045236 
2 10138 2007-01-04 TROW 0.008743 
3 10138 2007-01-05 TROW -0.001950 
4 10138 2007-01-08 TROW 0.018237 
5 10138 2007-01-09 TROW 0.004051 
6 10138 2007-01-10 TROW 0.005734 
7 10138 2007-01-11 TROW 0.019637 
8 10138 2007-01-12 TROW 0.005591 
... 
1 10145 2007-01-03 HON -0.003095 
2 10145 2007-01-04 HON -0.000443 
3 10145 2007-01-05 HON -0.009539 
4 10145 2007-01-08 HON 0.006047 
5 10145 2007-01-09 HON 0.007124 
6 10145 2007-01-10 HON -0.006189 
7 10145 2007-01-11 HON 0.016681 
8 10145 2007-01-12 HON -0.003282 
9 10145 2007-01-16 HON 0.001317 
10 10145 2007-01-17 HON -0.001754 
11 10145 2007-01-18 HON -0.010979 
... 

После того, как я использую tidyr::spread(x,TICKER,RETX), он возвращает матрицу с большей стоимостью быть NA. Есть ли какая-либо другая функция для изменения матрицы, указав каждую цену акций в одном столбце? или как добиться этого несколькими строками?

обновление: Я выясню, что это столбец PERMNO, вызывающий проблему. После того, как я избавляюсь от колонки PERMNO еще одна проблема появляется:

> spread(A1[,2:4],TICKER,RETX) 
Error: Duplicate identifiers for rows (129717, 143815), (129718, 143816), ... 

Таким образом, я просто случайно выбрать две строки, упомянутые в сообщении

 PERMNO  date TICKER  RETX 
129717 75104 2007-01-03 CBS 0.012172 
> A1[143815,] 
     PERMNO  date TICKER RETX 
143815 76226 2007-01-03 CBS 0.01347 

вывернуть набор данных сильно загрязнен и содержит дублируется серии. Лучшим решением будет использование PERMNO в качестве ключа. Вот что я получаю

date  10225  10516  10909  ... 
1 2007-01-03 0.005738 0.003129 -0.006593 ... 
2 2007-01-04 -0.011062 -0.005615 0.028761 ... 
3 2007-01-05 0.000824 -0.001568 -0.022366 ... 
4 2007-01-08 -0.005059 0.005027 -0.003520 ... 
5 2007-01-09 0.002956 -0.024383 0.000883 ... 
6 2007-01-10 -0.003301 -0.008651 -0.010587 ... 
... 

Это расстраивает, но я наконец-то получить. В любом случае, чтобы заменить имя числового столбца на соответствующий TICKER. Вот демо

PERMNO date  FO   HON  ... 
1 10225 2007-01-03 0.005738 -0.003095 ... 
2 10225 2007-01-04 -0.011062 -0.000443 ... 
3 10225 2007-01-05 0.000824 -0.009539 ... 
4 10225 2007-01-08 -0.005059 0.006047 ... 
5 10225 2007-01-09 0.002956 0.007124 ... 
6 10225 2007-01-10 -0.003301 -0.006189 ... 
7 10225 2007-01-11 0.007925 0.016681 ... 
8 10225 2007-01-12 -0.010914 -0.003282 ... 
+1

Я предполагаю, что вы имеете в виду 'tidyr :: spread' (я отредактировал ваш вопрос соответственно). Например, ваш пример плохой, потому что он отображает только одно значение «RETX», поэтому ваша проблема не проиллюстрирована. Ваш код отлично работает на этих 8 строках без возврата NA. (И он возвращает фрейм данных, а не матрицу.) 'Tidyr' не встроен, но вы можете увидеть' reshape2 :: dcast' для более гибкой версии 'spread'. – Gregor

+0

Однако, если вы получаете 'NA', я предполагаю, что у вас есть разные значения 'permno' или разные даты для ваших акций - вероятно, пермо. Поэтому, если этот столбец не применим к вашим данным распространения, просто снимите его перед распространением. – Gregor

+0

Спасибо за совет. Я впервые задал вопрос на этом сайте, я все еще работаю над этим. – HLD25

ответ

4

Если вы дублировали данные в местах, вы будете в первую очередь необходимо избавиться от этих значений, так как в противном случае, если вы используете tidyr::spread, он заменит значение с длиной. Во всяком случае, при условии, что вы удалили дубликаты с использованием уникального или что-то подобное, вот как я бы сделал это с tidyr, так это то, что вы просили, и с тех пор tidyr довольно изящный и краткий:

A1 <- spread(A1[, c("date", "TICKER", "RETX")], TICKER, RETX) 

Если включить PERMNO, вы получите NA для каждой строки, где это конкретное значение TICKER не имеет соответствующего значения в PERMNO.

Смежные вопросы