从具有等效索引的向量簇创建矩阵列表

Creating list of matrices from clusters of vectors with equivalent indices

我有两个不同的向量 - 一个有零和 0-0.5 之间的随机实数 (vec1) 和另一个有序向量 (vec2):

vec1 <- c(0.42887017, 0.26703377, 0, 0, 0, 0.33203175, 0.16787991, 0, 0, 0.19483491, 0.41869476, 0.05820833, 0.37449489, 0, 0, 0, 0, 0, 0.44390140, 0.19483491, 0.06736238, 0.31630117, 0, 0, 0, 0, 0, 0, 0.27121130, 0)
vec2 <- c(-0.1, -0.1, -0.1, -0.1, -0.1, 1.2, 1.2, 1.2, 1.2, 1.2, 0.5, 0.5, 0.5, 0.5, 0.5, 2.0, 2.0, 2.0, 2.0, 2.0, -0.6, -0.6, -0.6, -0.6, -0.6, 0.25, 0.25, 0.25, 0.25, 0.25)

对于第一个向量 vec1,我想创建大于 0 的向量簇,在第二个向量 vec2 中,我希望将等效定位的索引元素聚类如下(见粗体):

vec1 -> 0.42887017, 0.26703377, 0, 0, 0, 0.33203175, 0.16787991, 0, 0, 0.19483491, 0.41869476, 0.05820833, 0.37449489, 0, 0, 0, 0, 0, 0.44390140, 0.19483491, 0.06736238, 0.3163011=7, 0, 0, [=36] 0, 0, 0.27121130, 0

vec2 -> -0.1, -0.1, -0.1, -0.1, -0.1, 1.2, 1.2, 1.2, 1.2 , 1.2, 0.5, 0.5, 0.5, 0.5, 0.5, 2.0, 2.0, 2.0, 2.0, 2.0, -0.6, -0.6, - 0.6, -0.6, -0.6, 0.25, 0.25, 0.25, 0.25, 0.25

最好输出应该在具有等效索引的矩阵列表中:

[[1]]
          [,1] [,2]
[1,] 0.4288702 -0.1
[2,] 0.2670338 -0.1

[[2]]
          [,1] [,2]
[1,] 0.3320318  1.2
[2,] 0.1678799  1.2

[[3]]
           [,1] [,2]
[1,] 0.19483491  1.2
[2,] 0.41869476  0.5
[3,] 0.05820833  0.5
[4,] 0.37449489  0.5

[[4]]
           [,1] [,2]
[1,] 0.44390140  2.0
[2,] 0.19483491  2.0
[3,] 0.06736238 -0.6
[4,] 0.31630117 -0.6

[[5]]
          [,1] [,2]
[1,] 0.2712113 0.25

有没有人知道如何做到这一点?

谢谢

(当前问题)基础 R 解决方案:

# Cluster the data into groups, for each series of data above 0:
clustered <- subset(within(data.frame(cbind(vec1, vec2)),
                           {
                             grp <- cumsum(c(TRUE, diff(vec1) == vec1[-1]))
                           }), vec1 > 0)

# Split the dataframe into a list for each group, remove group vector:
setNames(split(within(clustered, rm("grp")), clustered$grp), 
         c(1:length(unique(clustered$grp))))

当前数据:

vec1 <- c(0.42887017, 0.26703377, 0, 0, 0, 0.33203175, 0.16787991, 0, 0, 0, 0.41869476, 0.05820833, 0.37449489, 0, 0, 0, 0, 0, 0.44390140, 0.19483491, 0.06736238, 0.31630117, 0, 0, 0, 0, 0, 0, 0.27121130, 0)
vec2 <- c(-0.1, -0.1, -0.1, -0.1, -0.1, 1.2, 1.2, 1.2, 1.2, 1.2, 0.5, 0.5, 0.5, 0.5, 0.5, 2.0, 2.0, 2.0, 2.0, 2.0, -0.6, -0.6, -0.6, -0.6, -0.6, 0.25, 0.25, 0.25, 0.25, 0.25)

(原题)Base R 解决方案:

clustered <- subset(within(data.frame(cbind(vec1, vec2)), 
       {grp <- cumsum(c(TRUE, abs(diff(vec1 > 9))))}), vec1 > 9)

setNames(Map(function(x){within(x, rm("grp"))}, 
    split(clustered, clustered$grp)), c(1:length(unique(clustered$grp))))

我设法找到了一种适合自己的方法,可能有点复杂:

list1 = list()

clust = c()
clust2 = c()

x = 1

for (i in 1:length(vec1)) {
  if (vec1[i] > 0 & i != length(vec1)) {
    clust = c(clust,vec1[i])
    clust2 = c(clust2,vec2[i])
  } else if (vec1[i] == 0 & length(clust) > 0) {
    list1[[x]] <- cbind(clust,clust2)
    
    x = x + 1
    clust = c()
    clust2 = c()
  } else if (i == length(vec1) & vec1[length(vec1)] > 0){
    clust = c(clust ,vec1[i])
    clust2 = c(clust2,vec2[i])
    
    list1[[x]] <- cbind(clust,clust2)
    
  } else {
  }
}

输出为:

> list1
[[1]]
         clust clust2
[1,] 0.4288702   -0.1
[2,] 0.2670338   -0.1

[[2]]
         clust clust2
[1,] 0.3320318    1.2
[2,] 0.1678799    1.2

[[3]]
          clust clust2
[1,] 0.19483491    1.2
[2,] 0.41869476    0.5
[3,] 0.05820833    0.5
[4,] 0.37449489    0.5

[[4]]
          clust clust2
[1,] 0.44390140    2.0
[2,] 0.19483491    2.0
[3,] 0.06736238   -0.6
[4,] 0.31630117   -0.6

[[5]]
         clust clust2
[1,] 0.2712113   0.25