按行顺序识别 NA

Identify NA's in sequence row-wise

我想根据条件按行在序列中填充 NA 值。请看下面的例子。

ID | Observation 1 | Observation 2 | Observation 3 | Observation 4 | Observation 5
 A         NA              0               1             NA             NA

条件是:

在上面的示例中,观察 1 中的 NA 值应保持为 NA。但是,观察 4 和观察 5 中的 NA 值应更改为 "Remove"。

您可以定义函数:

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

我们可以 applyr 的所有数字列的行进行函数处理:

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] 视为 matrixapply 的输出填充 matrix,默认情况下按列填充。因此,在将列替换回 r.

之前,我们必须转置结果 matrix

另一种调用replace.na的方法是:

r[,-1] <- do.call(rbind,lapply(data.frame(t(r[,-1])),replace.na,999))

在这里,我们首先转置 r 的数字列,使其成为 data.frame。这使得 r 的每一行成为列列表中的一列,即结果数据框。然后在这些列上使用 lapply 以应用 replace.narbind 结果。


如果你想在第一个非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