我需要替换向量中的第一个NA(例如:cc = c(NA, NA, 1, 3, 4)
)。我想用第一个非NA值替换它们(在这个例子中,它是1)。
我尝试了多种方法,例如zoo::na.locf
和zoo::na.fill
,但它们仅适用于向量中间的NA,但不适用于开头。有没有办法解决这个问题?
答案 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)
}