R 识别NA和x27;按行顺序排列

R 识别NA和x27;按行顺序排列,r,na,R,Na,我想根据一个条件按行顺序填充NA值。请参见下面的示例 ID | Observation 1 | Observation 2 | Observation 3 | Observation 4 | Observation 5 A NA 0 1 NA NA 条件是: 所有的NA值之前!序列中的NA值应保留为NA 但一切都在后面!序列中的NA值应标记(“删除”) 在上述示例中,观察

我想根据一个条件按行顺序填充NA值。请参见下面的示例

ID | Observation 1 | Observation 2 | Observation 3 | Observation 4 | Observation 5
 A         NA              0               1             NA             NA
条件是:

  • 所有的NA值之前!序列中的NA值应保留为NA
  • 但一切都在后面!序列中的NA值应标记(“删除”)

在上述示例中,观察值1中的NA值应保持为NA。然而,观察结果4和5中的NA值应更改为“删除”

您可以定义函数:

replace.na <- function(r,val) {
  i <- is.na(r)
  j <- which(i)
  k <- which(!i)
  r[j[j > k[length(k)]]] <- val
  r
}
我们可以对
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
的数字列,并使其成为
data.frame
。这使得
r
的每一行都成为列列表中的一列,该列是生成的数据帧。然后在这些列上使用
lappy
应用
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
}

replace.na实际数据的结构是什么?请使用
dput(对象的名称)
发布一个示例。在包含数字数据的data.frame中,使用字符串
“remove”
作为标记会有问题,因为在给定列中不能混合数字和非数字值。感谢您的提示响应。对象是仅包含数字变量的数据帧。我说的删除只是一个例子,它可以是任何数字作为一个标志。我知道你说的是行,但是
观察1
观察2
,等等是独立的列,你想对数据帧/表的每一行都这样做吗?是的,观察1,观察2。。。etc是独立的列。这是一个转置的数据帧。正确,我想对整个数据帧执行此操作。太好了@aichao。。。甚至我也在尝试类似的事情,但你做到了!如果我想将obs2改为999,那么解决方案是什么呢?非常感谢!非常有用。@User2321:第一个版本只会将最后一个非NA后的所有NA替换为替换值。因此,对于您的数据
r
r[,-1] <- do.call(rbind,lapply(data.frame(t(r[,-1])),replace.na,999))
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