我希望根据条件在行序列中填充NA值。请参阅下面的示例。
ID | Observation 1 | Observation 2 | Observation 3 | Observation 4 | Observation 5
A NA 0 1 NA NA
条件是:
在上面的示例中,观察1中的NA值应保持为NA。但是,观察4和5中的NA值应改为“删除”。
答案 0 :(得分:3)
您可以定义功能:
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
对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]
视为matrix
,apply
的输出会填充matrix
,默认情况下会按列填充。因此,我们必须在将列替换回matrix
之前转置生成的r
。
另一种致电replace.na
的方式是:
r[,-1] <- do.call(rbind,lapply(data.frame(t(r[,-1])),replace.na,999))
在这里,我们首先转置r
的数字列并将其设为data.frame
。这使r
的每一行成为列表中的列,即结果数据帧。然后在这些列上使用lapply
来应用replace.na
和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