【发布时间】:2014-01-08 04:29:13
【问题描述】:
我有一个大型数据集,其中包含一列 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]
如果你们能提供任何帮助或建议,我们将不胜感激!
【问题讨论】:
标签: 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]
如果你们能提供任何帮助或建议,我们将不胜感激!
【问题讨论】:
标签: r nan statistics
使用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
【讨论】:
replace()。不清楚你想要什么。尝试在一个新问题中给出一个最小的示例,并添加您尝试过但不起作用的代码。确保你链接到这个。
这是另一种方法。首先将全部转换为零,然后将第一个零转换回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
【讨论】: