您可以定义该函数:
replace.na <- function(r,val) {
i <- is.na(r)
j <- which(i)
k <- which(!i)
r[j[j > k[length(k)]]] <- val
r
}
然后,假设您有一个data.frame
像这样:
r <- data.frame(ID=c('A','B'),obs1=c(NA,1),obs2=c(0,NA),obs3=c(1,2),obs4=c(NA,3),obs5=c(NA,NA))
## ID obs1 obs2 obs3 obs4 obs5
##1 A NA 0 1 NA NA
##2 B 1 NA 2 3 NA
We can apply
对所有数字列的行进行函数r
:
r[,-1] <- t(apply(r[,-1],1,replace.na,999))
## ID obs1 obs2 obs3 obs4 obs5
##1 A NA 0 1 999 999
##2 B 1 NA 2 3 999
这治疗r[,-1]
as a matrix
和输出apply
填充一个matrix
,默认情况下由列填充。因此,我们必须转置结果matrix
在将列替换回之前r
.
另一种打电话方式replace.na
is:
r[,-1] <- do.call(rbind,lapply(data.frame(t(r[,-1])),replace.na,999))
在这里,我们转置数字列r
首先并将其设为data.frame
。这使得每一行r
列列表中的一列,即结果数据框。然后使用lapply
在这些列上应用replace.na
and rbind
结果。
如果你想标记所有NA
在第一个非之后NA
,那么函数replace.na
应该:
replace.na <- function(r,val) {
i <- is.na(r)
j <- which(i)
k <- which(!i)
r[j[j > k[1]]] <- val
r
}
将其应用到数据上:
r[,-1] <- do.call(rbind,lapply(data.frame(t(r[,-1])),replace.na,999))
## ID obs1 obs2 obs3 obs4 obs5
##1 A NA 0 1 999 999
##2 B 1 999 2 3 999