【问题标题】:Creating list of matrices from clusters of vectors with equivalent indices从具有等效索引的向量簇创建矩阵列表
【发布时间】:2020-10-25 00:05:22
【问题描述】:

我有两个不同的向量 - 一个是零和 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.058208933, 0.3744 0, 0, 0, 0, 0, 0.44390140, 0.19483491, 0.06736238, 0.31630117, 0, 0, 0, 0, 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

有人对如何做到这一点有一些想法吗?

谢谢

【问题讨论】:

  • 同等索引是什么意思?从您的示例看来,您似乎想要检索 vec1 中大于 9 的元素的索引?
  • 抱歉,我的措辞可能不对。我想让 vec2 的元素聚集在与 vec1 相同的位置。然后我想将相应的簇组合成两列矩阵。
  • @Huntmerson 请在下面查看我的解决方案,如果它符合您的原始问题要求,请投票并接受它。

标签: r list matrix indexing cluster-computing


【解决方案1】:

(当前问题)Base 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[[1]][2,1])。这样我就可以使用列表来执行更多的计算。
  • @Huntemerson 这就是输出,你应该检查你的控制台,我没有将第二组函数调用分配给变量。如果您要像这样开始该调用:res &lt;- 您将存储一个 data.frames 列表。尽管您在原始答案之后更改了问题,但两次答案都是正确的(这不是很好的做法)。如果它回答了您的上述问题,请投票并接受此答案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 2018-07-19
    • 2016-04-24
    • 2012-07-28
    • 1970-01-01
    • 2018-07-28
    • 2013-11-18
    相关资源
    最近更新 更多