我有一个大型数据集,其中包含一列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]
非常感谢你们提供的任何帮助或建议!
答案 0 :(得分:3)
使用match()
和数字索引很容易做到:
match()
查找非NA值的第一次出现which()
将逻辑向量从is.na()
转换为数字索引因此:
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