gpt4 book ai didi

r - tidyr 中的 spread() 函数

转载 作者:行者123 更新时间:2023-12-04 11:33:40 25 4
gpt4 key购买 nike

我有一个股票价格的 CRSP 列表如下

    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 作为 key 。这是我得到的

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

最佳答案

如果您在某些地方有重复数据,您首先需要删除这些值,否则,如果您使用 tidyr::spread,它将用长度替换值。无论如何,假设您已经使用 unique 或类似的东西删除了重复项,这就是我使用 tidyr 的方法,因为这就是您的要求,而且 tidyr 非常漂亮和简洁:

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

如果您包含 PERMNO,您将在 TICKER 的特定值在 PERMNO 中没有匹配值的每一行得到 NA >。

关于r - tidyr 中的 spread() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28467368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com