发现聚集的NaNs,但只留下孤独的NaNs

Eas*_*nly 3 matlab nan

我有一个不完整的数据集,

http://imgur.com/Tpu6Hcf

N = [NaN 1 2 3 NaN 5 6 NaN NaN 7 8 10 12 20 NaN NaN NaN NaN NaN]'
Run Code Online (Sandbox Code Playgroud)

我想确定一组Nans,也就是说,如果它们的后续数量超过2.我该怎么做?

Raf*_*iro 5

你可以这样做:

aux = diff([0; isnan(N); 0]);
clusters = [find(aux == 1) find(aux == -1) - 1];
Run Code Online (Sandbox Code Playgroud)

然后,簇将是Nx2矩阵,其中N是NaN簇的数量(所有这些),并且每行为您提供簇的开始和结束索引.

在这个例子中,那将是:

clusters =

     1     1
     5     5
     8     9
    15    19
Run Code Online (Sandbox Code Playgroud)

这意味着您有4个NaN群集,群集1范围从索引1到索引1,群集2范围从5到5,群集3范围从8到9,群集4范围从15到19.

如果您只想要具有至少KNaN 的群集,您可以这样做(例如,K = 2):

K = 2;
clusters(clusters(:,2) - clusters(:,1) + 1 >= K, :)
Run Code Online (Sandbox Code Playgroud)

这会给你这个:

ans =

     8     9
    15    19
Run Code Online (Sandbox Code Playgroud)

也就是说,簇8-9和15-19具有2个或更多个NaN.

说明:

  • 寻找集群

isnan(N) 给你一个包含NaNs的逻辑向量:

N --------> NaN 1  2  3 NaN 5  6 NaN NaN 7  8 10 12 20 NaN NaN NaN NaN NaN
isnan(N) ->  1  0  0  0  1  0  0  1   1  0  0  0  0  0  1   1   1   1   1
Run Code Online (Sandbox Code Playgroud)

我们想知道每个序列的起始位置,所以我们使用diff它来计算每个值减去前一个值,然后给出:

aux = diff(isnan(N));
N ----> NaN 1  2  3 NaN 5  6 NaN NaN 7  8 10 12 20 NaN NaN NaN NaN NaN
aux --> -1  0  0  1 -1  0  1  0  -1  0  0  0  0  1   0   0   0   0
Run Code Online (Sandbox Code Playgroud)

其中a 1表示组开始,a -1表示组结束.但它错过了第一组开始和最后一组结束,因为第一个1元素缺席(它没有先前的N因为它是第一个)而且最后一个-1也没有(因为在最后一个之后没有任何1内容N) .常见的解决方法是在数组之前和之后添加零,这样就可以得到:

aux = diff([0; isnan(N); 0]);
N ----> NaN 1  2  3 NaN 5  6 NaN NaN 7  8 10 12 20 NaN NaN NaN NaN NaN
aux -->  1 -1  0  0  1 -1  0  1  0  -1  0  0  0  0  1   0   0   0   0  -1
Run Code Online (Sandbox Code Playgroud)

注意两件事:

  1. 如果index i处的diff 是1,N(i)则是NaN块的开始.
  2. 如果索引i处的diff 是-1,N(i - 1)则是NaN块的结尾.

为了获得开始和结束,我们使用find获取aux == 1和aux == -1的索引.因此,我们调用find两次,并使用[和连接两个调用]:

aux = diff([0; isnan(N); 0]);
clusters = [find(aux == 1) find(aux == -1) - 1];
Run Code Online (Sandbox Code Playgroud)
  • 过滤具有K个或更多元素的簇

最后一步是找到具有K个或更多元素的簇.为此,我们首先采用聚类矩阵并从第一列中减去第一列,然后添加1,如下所示:

clusters(:,2) - clusters(:,1) + 1
ans = 
     1
     1
     2
     5
Run Code Online (Sandbox Code Playgroud)

这意味着簇1和2具有1个NaN,簇3具有3个NaN,簇4具有5个NaN.如果我们问哪个值大于或等于K,我们得到:

clusters(:,2) - clusters(:,1) + 1 >= K
ans =
     0
     0
     1
     1
Run Code Online (Sandbox Code Playgroud)

这是一个逻辑阵列.我们可以使用它来仅索引1集群矩阵的(真)行,如下所示:

clusters(clusters(:,2) - clusters(:,1) + 1 >= K, :)
ans =

     8     9
    15    19
Run Code Online (Sandbox Code Playgroud)

这就像问:给我们只给出行与这个逻辑向量上的行匹配的簇,并给我们所有列(用表示:).