我有这个假设的数据框
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 行。因此,更通用的代码会有很大帮助。
您可以使用
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