r - 检查R中数据框中NA的开始和结束索引

标签 r

我有一个列名为 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::rleidtapply 的解决方案:

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::rleNAs 给予特殊处理,而 data.table::rleid 没有,所以我使用了 Inf,使其不太健壮。

关于r - 检查R中数据框中NA的开始和结束索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50698909/

相关文章:

使用 tidyverse 删除给定特定条件的重复条目

r - 按两列分组并汇总多列

r - GGally putPlot 无法在循环中工作

r - 当在 geom_text 中定义指南时更改图例符号

r - 从公式中提取预测变量

r - 如何通过值中字符的第一个实例拆分数据框列

r - 如何保存存储在 R 列表列中的对象

r - 如何将变量传递给 ddply 中的自定义函数?

r - 使用 tidymodel 的 GLM 系列

r - 使用R?在VECM模型中的模量值(根)。