我有一个列名为 sorted_no
的 Dataframe,如下所示
x_n$sorted_no
1 2 NA 3 4 NA NA NA NA NA NA NA 5 NA NA NA NA 6 NA NA NA NA NA 7
我想要此列中 NA
值的开始和结束索引,如下所示
start end
2 4
5 13
13 18
18 24
最佳答案
在基础 R
中:
vec <- scan(text="1 2 NA 3 4 NA NA NA NA NA NA NA 5 NA NA NA NA 6 NA NA NA NA NA 7", what=numeric())
diff_vec <- diff(is.na(c(0,vec)))
# [1] 0 0 1 -1 0 1 0 0 0 0 0 0 -1 1 0 0 0
# [18] -1 1 0 0 0 0 -1
data.frame(start= which(diff_vec==1)-1,
end= which(diff_vec==-1))
# start end
# 1 2 4
# 2 5 13
# 3 13 18
# 4 18 24
c(0,vec)
中的 0
帮助我们确保我们不是以 NA
开头
另一种使用 data.table::rleid
和 tapply
的解决方案:
library(data.table)
do.call(rbind,
tapply(seq_along(vec)[is.na(vec)],rleid(vec)[is.na(vec)],
function(x) data.frame(start=min(x)-1,end=max(x)+1)))
# start end
# 3 2 4
# 6 5 13
# 8 13 18
# 10 18 24
这里我使用 rleid
创建组,使用 seq_along
创建索引,在这些组中我使用 min
和 最大
索引。
使用 rle
的基本解决方案:
vec[is.na(vec)] <- Inf
rle_ <- rle(vec)
cumsum_ <- cumsum(rle_$lengths)
infs_ <- which(rle_$value == Inf)
data.frame(start = c(0,cumsum_)[infs_], end = cumsum_[infs_]+1)
# start end
# 1 2 4
# 2 5 13
# 3 13 18
# 4 18 24
base::rle
对 NAs
给予特殊处理,而 data.table::rleid
没有,所以我使用了 Inf
,使其不太健壮。
关于r - 检查R中数据框中NA的开始和结束索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50698909/