数据帧中第一个数值之前按行有多少个 NA?

问题描述 投票:0回答:1

我有这个假设的数据框

  df <- data.frame(K=c(NA, NA, 3, 4,0,2,NA, NA), A=c(NA, NA, NA, 4,0,3,NA, NA), B=c(NA, 2, NA, NA,0,NA,NA,0), C=c(0, 3, 5, NA,0,5,NA,5), D=c(NA, 3, 1, 2,0,10,NA,3))
     df  
       K  A  B  C  D
    1 NA NA NA  0 NA
    2 NA NA  2  3  3
    3  3 NA NA  5  1
    4  4  4 NA NA  2
    5  0  0  0  0  0
    6  2  3 NA  5 10
    7 NA NA NA NA NA
    8 NA NA  0  5  3

我想按行查找在第一个数值(该行中)之前有多少个 NA,并且我想将此信息添加为上述数据框中的最后一列

所以我想拥有

df2 <- data.frame(K=c(NA, NA, 3, 4,0,2,NA, NA), A=c(NA, NA, NA, 4,0,3,NA, NA), B=c(NA, 2, NA, NA,0,NA,NA,0), C=c(0, 3, 5, NA,0,5,NA,5), D=c(NA, 3, 1, 2,0,10,NA,3),
        nn=c(3,2,0,0,0,0,5,2))
    df2
     
   K  A  B  C  D nn
1 NA NA NA  0 NA  3
2 NA NA  2  3  3  2
3  3 NA NA  5  1  0
4  4  4 NA NA  2  0
5  0  0  0  0  0  0
6  2  3 NA  5 10  0
7 NA NA NA NA NA  1000
8 NA NA  0  5  3  2

例如,第一行在第一个值 0 之前包含 3 个 NA。 第二行在第一个值 2 之前包含 2 个 NA。 第三行在第一个值 3 之前包含零个 NA,第 4-6 行也是如此。 对于第七行,我们只有 NA,因此在本例中我只使用任意值 1000。 对于第八行,我们在第一个值 0 之前有两个 NA。

我试过这个

DD<-apply(df,1,function(x) which(!is.na(x)))
unlist(map(DD, 1) , use.names=FALSE)-1

但它不起作用,因为我得到了

3 2 0 0 0 0 2

我错过了仅包含 NA 的行。 有什么想法吗? 使用 dplyr 可以做到这一点吗?

请注意,我的真实数据集包含 500 列和 200000 行。因此,更通用的代码会有很大帮助。

r database
1个回答
0
投票

您可以使用

max.col

> df$nn <- max.col(!is.na(df), "first") - 1

> df
   K  A  B  C  D nn
1 NA NA NA  0 NA  3
2 NA NA  2  3  3  2
3  3 NA NA  5  1  0
4  4  4 NA NA  2  0
5  0  0  0  0  0  0
6  2  3 NA  5 10  0
© www.soinside.com 2019 - 2024. All rights reserved.