有没有办法在二维数组中提取连续特征

Posted

技术标签:

【中文标题】有没有办法在二维数组中提取连续特征【英文标题】:Is there a way to extract continuous feature in an 2D array 【发布时间】:2010-03-18 13:56:26 【问题描述】:

假设我有一个数字数组

a

如果有办法告诉 R 只输出从“a”开始的连续序列的范围 例如,“a”中的连续序列如下

1,3 6,10 20

非常感谢! 德里克

【问题讨论】:

【参考方案1】:

我认为没有直接的方法,但您可以创建两个逻辑向量来告诉您下一个/上一个元素是否是 1 最大/最小。例如:

data.frame(
  a,
  is_first = c(TRUE,diff(a)!=1),
  is_last = c(diff(a)!=1,TRUE)
)
# Gives you:
   a is_first is_last
1  1     TRUE   FALSE
2  2    FALSE   FALSE
3  3    FALSE    TRUE
4  6     TRUE   FALSE
5  7    FALSE   FALSE
6  8    FALSE   FALSE
7  9    FALSE   FALSE
8 10    FALSE    TRUE
9 20     TRUE    TRUE

所以范围是:

cbind(a[c(TRUE,diff(a)!=1)], a[c(diff(a)!=1,TRUE)])
[1,]    1    3
[2,]    6   10
[3,]   20   20

【讨论】:

【参考方案2】:

我这样做了(我承认不是那么优雅)以防您想要列表中每个序列的所有数字

a <- c(1,2,3,6,7,8,9,10,20)

z <- c(1,which(c(1,diff(a))!=1))

g <- lapply(seq(1:length(z)),function(i) 
if (i < length(z)) a[z[i] : (z[i+1] - 1)] 
else a[z[i] : length(a)] 
)


[[1]]
[1] 1 2 3

[[2]]
[1]  6  7  8  9 10

[[3]]
[1] 20

然后你可以得到一个像这样的二维数组

sapply(g,function(x) c(x[1],x[length(x)]))

     [,1] [,2] [,3]
[1,]    1    6   20
[2,]    3   10   20

【讨论】:

【参考方案3】:
> a <- c(1,2,3,6,7,8,9,10,20)
> N<-length(a)
> k<-2:(N-1)
> z<-(a[k-1]+1)!=a[k] | (a[k+1]-1)!=a[k]
> c(a[1],a[k][z],a[N])
[1]  1  3  6 10 20

【讨论】:

以上是关于有没有办法在二维数组中提取连续特征的主要内容,如果未能解决你的问题,请参考以下文章

C++ 一维数组及二维数组的特征和用法

C 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )

PHP二维数组提取函数----把不需要的数据剔除

有没有办法在二维数组中找到输入值的每个索引?

如何确保二维数组在内存中连续分配

试图将一个连续的动态二维数组从 C 传递到 Fortran