首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tidyr中的spread()函数

tidyr中的spread()函数
EN

Stack Overflow用户
提问于 2015-02-12 08:46:21
回答 1查看 12.6K关注 0票数 3

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

代码语言:javascript
复制
    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列之后,出现了另一个问题:

代码语言:javascript
复制
> spread(A1[,2:4],TICKER,RETX)
Error: Duplicate identifiers for rows (129717, 143815), (129718, 143816), ...

因此,我只需随机选择消息中提到的两行

代码语言:javascript
复制
       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作为键。以下是我得到的结果

代码语言:javascript
复制
    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   ...
...

这很令人沮丧,但我终于得到了一些东西。有没有办法用匹配的滚动条替换数字列名。这是一个演示

代码语言:javascript
复制
    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  ...
EN

回答 1

Stack Overflow用户

发布于 2015-02-12 13:41:40

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

代码语言:javascript
复制
 A1 <- spread(A1[, c("date", "TICKER", "RETX")], TICKER, RETX)

如果包含PERMNO,那么对于TICKER的特定值在PERMNO中没有匹配值的每一行,您都会得到NAs。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28467368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档