检测数字序列中的间隙是随机的还是连续的

Posted

技术标签:

【中文标题】检测数字序列中的间隙是随机的还是连续的【英文标题】:Detect if gaps in numeric sequences are at random or contiguous 【发布时间】:2020-05-02 14:00:04 【问题描述】:

我有许多数字数据向量,其中一些包含间隙。我必须检测这些间隙是连续的还是随机分布在每个向量中的。类似的例子在这里:

# Let's create a couple of data vectors
x <- runif(1000)
y <- runif(1000)

# Let's add some NAs at random to x
x[sample(c(1:1000), 100, replace = F)] <- NA
# Let's add some continuous NAs to y
y[c(251:350)] <- NA

# And get the respective summaries
summary(x)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
0.00294 0.24446 0.51441 0.50535 0.76200 0.99850     100 
summary(y)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
0.00325 0.22178 0.47765 0.48207 0.73380 0.99969     100

也就是说,x 和 y 具有相同数量的间隙,但在 x 中,这些间隙沿向量随机分布,而在 y 中,它们是聚合的。 我必须检测到这一点,有什么想法吗?

【问题讨论】:

这确实是一个统计问题,如何检测子集是否是随机的。我建议将其移至 stats.stackexchange.com 【参考方案1】:

把它变成一个tibble,然后看看NA的行号的标准偏差。

library(tidyverse)
myt <- tibble(X = x, Y = y) %>%  
  rowid_to_column("LINE") 

myt %>% 
  filter(is.na(X)) %>% 
  pull(LINE) %>% 
  sd()
# [1] 300.2694
myt %>% 
  filter(is.na(Y)) %>% 
  pull(LINE) %>% 
  sd()
# [1] 29.01149

【讨论】:

【参考方案2】:

连续或分布式的定义在帖子中并不是很清楚。

如果至少有一系列NA 值大于n 的长度,则这是一个返回TRUE 的函数。

is_contiguous <- function(vec, n) with(rle(is.na(vec)), any(lengths[values] > n))

is_contiguous(x, 30)
#[1] FALSE

is_contiguous(y, 30)
#[1] TRUE

【讨论】:

以上是关于检测数字序列中的间隙是随机的还是连续的的主要内容,如果未能解决你的问题,请参考以下文章

使用XQuery / Xpath检测xml:id序列中的间隙/第一个ID

T-SQL 识别损坏的日期序列中的间隙

随机序列的最大连续子序列和的期望

查找连续序列并建议序列中的下一个数字

检测 div 网格中的间隙

在c中随机化一维数组中的序列[重复]