R 将行中的初始NA值替换为零,直到非NA列为止

R 将行中的初始NA值替换为零,直到非NA列为止,r,vector,na,R,Vector,Na,考虑数据集中的以下行:- #Row (initially): NA NA NA NA NA NA NA 2 3 1 4 5 2 NA NA 6 7 我希望所有这些行都转换为 #Row (modified) : 0 0 0 0 0 0 0 2 3 1 4 5 2 NA NA 6 7 只有在任何非NA值之前出现的初始NA可以替换为零,而不是之后出现的NA 编辑:我的数据是矩阵,例如: NA NA NA NA 1 1 1 1 1 1

考虑数据集中的以下行:-

#Row (initially):
NA NA NA NA NA NA NA 2 3 1 4 5 2 NA NA 6 7
我希望所有这些行都转换为

#Row  (modified) :
0  0  0  0  0  0  0 2 3 1 4 5 2 NA NA 6 7
只有在任何非NA值之前出现的初始NA可以替换为零,而不是之后出现的NA

编辑:我的数据是矩阵,例如:

NA   NA   NA   NA    1    1    1    1    1     1
NA   NA   NA   NA    1    1    1    1    1     1
NA   NA   NA   NA    1    1    1    1    1     1
NA   NA   NA   NA   NA   NA   NA    1   NA     1
NA   NA   NA   NA   NA   NA   NA    1   NA     1
NA   NA   NA   NA   NA   NA   NA   NA   NA     1
1    1    1    1    1    1    1    1   NA     1
1    1    1    1    1    1    1    1    1     1
它应该修改为

0    0    0    0    1    1    1    1    1     1
0    0    0    0    1    1    1    1    1     1
0    0    0    0    1    1    1    1    1     1
0    0    0    0    0    0    0    1   NA     1
0    0    0    0    0    0    0    1   NA     1
0    0    0    0    0    0    0    0    0     1
1    1    1    1    1    1    1    1   NA     1
1    1    1    1    1    1    1    1    1     1

对于更新的示例:

我们可以使用
apply
行方式和
replace
将值替换为0,直到第一次出现非NA值

t(apply(mat, 1, function(x) replace(x, cumsum(!is.na(x)) == 0, 0)))


#     V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
#[1,]  0  0  0  0  1  1  1  1  1   1
#[2,]  0  0  0  0  1  1  1  1  1   1
#[3,]  0  0  0  0  1  1  1  1  1   1
#[4,]  0  0  0  0  0  0  0  1 NA   1
#[5,]  0  0  0  0  0  0  0  1 NA   1
#[6,]  0  0  0  0  0  0  0  0  0   1
#[7,]  1  1  1  1  1  1  1  1 NA   1
#[8,]  1  1  1  1  1  1  1  1  1   1
原始答案

我们可以同时使用
which
min
来查找第一个非NA值的索引,并将这些值替换为0

x[1:min(which(!is.na(x))) - 1] <- 0
x
#[1]  0  0  0  0  0  0  0  2  3  1  4  5  2 NA NA  6  7
最简单的是
which.min

x[1:which.min(is.na(x)) - 1] <- 0

x[1:which.min(is.na(x))-1]定义函数并使用apply。这里是一个工作示例。该函数只是测试逻辑值的总和是否在增加

x<-c(NA,NA,NA,NA,1,0,NA,NA,3)
    y<-c(2,NA,3,NA,1,0,NA,2,3)
    z<-c(NA,NA,3,NA,1,0,NA,NA,3)
    df<-data.frame(x,y,z)


    initialNA<-function(x){
      index<-cumsum(is.na(x))>=seq_along(x)
      x[index]<-0
      x
    }

    df2<-data.frame(t(apply(df,1,initialNA)))

x使用
cummin

x[cummin(is.na(x))==1] <- 0

#[1]  0  0  0  0  0  0  0  2  3  1  4  5  2 NA NA  6  7

下面是一个使用
rle()
的解决方案:

与包动物园:
zoo
中有一个函数用于此任务:

x <- c(NA, NA, NA, NA, NA, NA, NA, 2, 3, 1, 4, 5, 2, NA, NA, 6, 7)
library("zoo")
na.fill(x, c(0,NA,NA))

x必须对每行按行执行此操作。是否可以对整个矩阵执行此操作。@rishabh能否请您用一个示例更新您的问题,解释您试图执行的操作?编辑的想法源自我的答案!我不会这么做的。
x[cummin(is.na(x))==1] <- 0

#[1]  0  0  0  0  0  0  0  2  3  1  4  5  2 NA NA  6  7
t(apply(m,1,function(x) replace(x, cummin(is.na(x))==1, 0)))

    # [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    0    0    0    0    1    1    1    1    1     1
# [2,]    0    0    0    0    1    1    1    1    1     1
# [3,]    0    0    0    0    1    1    1    1    1     1
# [4,]    0    0    0    0    0    0    0    1   NA     1
# [5,]    0    0    0    0    0    0    0    1   NA     1
# [6,]    0    0    0    0    0    0    0    0    0     1
# [7,]    1    1    1    1    1    1    1    1   NA     1
# [8,]    1    1    1    1    1    1    1    1    1     1
x <- c(NA, NA, NA, NA, NA, NA, NA, 2, 3, 1, 4, 5, 2, NA, NA, 6, 7)
if (is.na(x[1])) x[1:rle(is.na(x))$lengths[1]] <- 0
x
f <- function(x) {
    if (is.na(x[1])) x[1:rle(is.na(x))$lengths[1]] <- 0
    x
}
apply(yourMatrix, 1, f)
t(apply(yourMatrix, 1, f))
x <- c(NA, NA, NA, NA, NA, NA, NA, 2, 3, 1, 4, 5, 2, NA, NA, 6, 7)
library("zoo")
na.fill(x, c(0,NA,NA))