从具有等效索引的向量簇创建矩阵列表
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
我有两个不同的向量 - 一个有零和 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