R - 替换向量中的第一个NA

时间:2015-05-25 21:18:01

标签: r

我需要替换向量中的第一个NA(例如:cc = c(NA, NA, 1, 3, 4))。我想用第一个非NA值替换它们(在这个例子中,它是1)。

我尝试了多种方法,例如zoo::na.locfzoo::na.fill,但它们仅适用于向量中间的NA,但不适用于开头。有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:3)

您可以尝试first中的dplyr功能,如下所示:

d = c(NA, NA, 1, 3, 4)

library(dplyr)
#first non-na value
a <- first(d[!is.na(d)])
#position of the first non-na value
b <- which(!is.na(d))[1]

#replace the first na values with the non-na from above
d[1:(b-1)] <- a

输出:

> d
[1] 1 1 1 3 4

答案 1 :(得分:1)

我会使用cumprod(is.na())为主要的NA制作索引; cumprod会将中间或结尾的任何NA归零。您还需要将其转换回逻辑,使用as.logical或双重否定。

R>x <- c(NA, NA, 1,3,4)
R>cumprod(is.na(x))
[1] 1 1 0 0 0
R>i <- cumprod(is.na(x))
R>x[!!i] <- x[which.min(i)]
R>x
[1] 1 1 1 3 4

答案 2 :(得分:0)

我认为NA始终处于领先地位?但如果没有,为了完整性:

na.change <- function(vec){
if(sum(!is.na(vec))==0)return(vec)
if(sum(is.na(vec))==0)return(vec)
if(min(which(is.na(vec)))>max(which(!is.na(vec))))return(vec)# only trailing NAs
idx.min <- min(which(is.na(vec)))
idx.max <- min(which(!is.na(vec[idx.min:length(vec)])))-2+idx.min
vec[idx.min:idx.max] <- vec[idx.max+1]
return(vec)
}