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

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.我该怎么做?
你可以这样做:
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)
注意两件事:
i处的diff 是1,N(i)则是NaN块的开始.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个或更多元素的簇.为此,我们首先采用聚类矩阵并从第一列中减去第一列,然后添加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)
这就像问:给我们只给出行与这个逻辑向量上的行匹配的簇,并给我们所有列(用表示:).