【问题标题】:spread() function in tidyrtidyr 中的 spread() 函数
【发布时间】:2015-02-12 00:46:21
【问题描述】:

我有一个股票价格的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 作为键。 这是我得到的

    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(我相应地编辑了您的问题)。您的示例很差,因为它只显示了一个值 RETX,所以没有说明您的问题——您的代码在这 8 行上运行得很好,没有返回 NAs。 (它返回一个数据框,而不是矩阵。)tidyr 不是内置的,但您可以查看reshape2::dcast 以获得更灵活的spread 版本。
  • 但是,如果您收到NAs,我假设您的股票有不同的permno 值或不同的日期——可能是永久的。因此,如果该列不适用于您的传播数据,请在传播之前将其删除。
  • 感谢您的建议。这是我第一次在这个网站上发布问题,我还在努力。
  • 没问题!只需使用一些显示问题的数据来编辑您的问题。你可以看到更多reproducibility tips here。但是请务必将新数据编辑到您的问题中,否则我们无法看到问题或测试解决方案。尝试找到 8 或 10 行,有两个 TICKER 值,每个 4 或 5 个日期,以显示问题。或许可以解释一下PERMNO是什么。
  • 那是你的问题。如果您需要更多帮助,请将代码编辑到您的问题中,而不是将大量代码放入 cmets。如果这样可以解决您的问题,您可能只想删除问题。

标签: r multiple-columns spread


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 2016-09-16
    • 2019-12-31
    • 2015-06-05
    • 1970-01-01
    相关资源
    最近更新 更多