R仅在第一个非零值之后转换NA

时间:2013-12-19 14:39:49

标签: r nan statistics

我有一个大型数据集,其中包含一列ID,后跟每个ID的每月时间序列。在这个集合中有频繁的缺失值,但我想要做的是在第一个非零之后用零替换所有的NA,同时将所有的NA留在第一个非零值之前作为NA。

例如

[NA NA NA 1 2 3 NA 4 5 NA]将更改为[NA NA NA 1 2 3 0 4 5 0]

非常感谢你们提供的任何帮助或建议!

2 个答案:

答案 0 :(得分:3)

使用match()和数字索引很容易做到:

  • 使用match()查找非NA值的第一次出现
  • 使用which()将逻辑向量从is.na()转换为数字索引
  • 使用该信息在x
  • 中找到正确的位置

因此:

x <- c(NA,NA,NA,1,2,3,NA,NA,4,5,NA)
isna <- is.na(x)
nonna <- match(FALSE,isna)
id <- which(isna)
x[id[id>nonna]] <- 0

给出:

> x
 [1] NA NA NA  1  2  3  0  0  4  5  0

答案 1 :(得分:1)

这是另一种方法。首先将全部转换为零,然后将第一个零转换回NA

> x <- c(NA,NA,NA,1,2,3,NA,NA,4,5,NA)
> x[which(is.na(x))] <- 0
### index from 1 to first element before the first element >0
> x[1:min(which(x>0))-1] <- NA
> x
 [1] NA NA NA  1  2  3  0  0  4  5  0

### end of vector (elements are >0)
> endOfVec <- min(which(x>0)):length(x)
> x[endOfVec][is.na(x[endOfVec])] <- 0
[1] NA NA NA  1  2  3  0  0  4  5  0