首页 > 解决方案 > 如果一列中至少有两个零,我如何用 NA 替换所有零?

问题描述

我从 Datastream 获得每日价格/退货数据。由于如果股票死了,Datastream 不会结束一个系列,它会显示最后一个有效价格,直到我的时间跨度结束。我想用 NA 替换所有这些零回报。但是通过这样做,我可能会更改一些有效的零回报。因此,只有在彼此之后有两个(或 4 个,必须指定)零时,我才想用 NA 替换零。因为我是新手,所以我不熟悉 if 条件/循环。

这是我的第一次尝试:

Return.Monthly[Return.Monthly==0]<-NA

但正如我所说,有一些有效的退货可能会被删除。

所以我想要:

  Return.Monthly[Return.Monthly==0]<-NA if (Return.Monthly[i+1,]     ==0)

当然,这也必须适用于最后一行。(在最好的情况下)

非常感谢您的帮助 !

编辑:

所以现在我得到了这个:

回报:

       AAPL  AMZ    YHOO
        0.2   0.3     0
        0     0      0.4
        0     0.3    0.6
        0     0.2    0.5

我想要这个:

回报:

       AAPL    AMZ    YHOO
        0.2    0.3     0
        NA     0       0.4
        NA     0.3     0.6
        NA     0.2     5

标签: rreplace

解决方案


假设第一期所有公司都存在,最后一期没有公司消失:

 ret <- rbind(c(0.2, 0.3, 0),
              c(0, 0, 0.4),
              c(0, 0.3, 0.6),
             c(0, 0.2, 0.5))

retU <- rbind(ret[-1,], 0L) # shifts the matrix up one row to
                                     # compare with the next period 
both <- (ret == 0) & (retU == 0)

retcpy = ret
retcpy[cbind(row(ret)[both], col(ret)[both])] <- NA


> ret 
     [,1] [,2] [,3]
[1,]  0.2  0.3  0.0
[2,]  0.0  0.0  0.4
[3,]  0.0  0.3  0.6
[4,]  0.0  0.2  0.5
> retcpy
  [,1] [,2] [,3]
[1,]  0.2  0.3  0.0
[2,]   NA  0.0  0.4
[3,]   NA  0.3  0.6
[4,]   NA  0.2  0.5


推荐阅读