您可以定义功能:
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
This treat r[,-1]
作为matrix
,并且apply
的输出填充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.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
什么是你的实际数据的结构?请使用'dput(name_of_object)'发布一个样本。在包含数字数据的data.frame中使用字符串'“remove”'作为标志将会产生问题,因为您不能在给定列中混合使用数字和非数字值。 – nrussell
感谢您的及时回应。该对象是仅包含数值变量的数据帧。我说删除只是一个例子,它可以是任何数字作为标志。 – Prometheus
我知道你说的行式,但是'观察1','观察2'等分开的列,并且您想要为数据帧/表的每一行执行此操作吗? – aichao