按行顺序识别 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
条件是:
- 序列中 !NA 值之前的所有 NA 值应保留为 NA;
- 但序列中 !NA 值之后的所有 NA 都应标记 ("remove")
在上面的示例中,观察 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
我们可以 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
,默认情况下按列填充。因此,在将列替换回 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
我想根据条件按行在序列中填充 NA 值。请看下面的例子。
ID | Observation 1 | Observation 2 | Observation 3 | Observation 4 | Observation 5
A NA 0 1 NA NA
条件是:
- 序列中 !NA 值之前的所有 NA 值应保留为 NA;
- 但序列中 !NA 值之后的所有 NA 都应标记 ("remove")
在上面的示例中,观察 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
我们可以 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
,默认情况下按列填充。因此,在将列替换回 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