使用索引向量子集矩阵

时间:2016-06-20 11:38:25

标签: r matrix

假设我有一个值矩阵,并且向量告诉我,对于矩阵的每一行,我想要访问哪一个(一个!)列。如何在没有循环的情况下检索这些值?

数据:

dta <- structure(c(0.02, 0.01, 0, 0.08, 0.18, 0.01, 0.12, 0, 0.03, 0, 
                   0.95, 0.96, 0.94, 0.97, 0.98, 0.95, 0.99, 0.91, 0.96, 0.98, 
                   0.98, 0.99, 1, 0.92, 0.82, 0.99, 0.88, 1, 0.97, 1, 
                   0.05, 0.04, 0.06, 0.03, 0.02, 0.05, 0.01, 0.09, 0.04, 0.02), 
                 .Dim = c(20L, 2L), .Dimnames = list(NULL, c("1", "2")))

指数载体:

idx <- c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)

期望的输出:

0.98
0.98
0.99
0.91
0.82
0.99
0.88
0.99
0.96
0.99
0.95
0.96
0.94
0.96
0.97
0.94
0.98
0.91
0.96
0.97

背景:e1071::cmeans返回membership,所有群集的所有点的成员资格值,以及cluster,最可能的群集。我想要一个最可能的聚类的隶属度值的向量来为聚类图生成透明颜色。

2 个答案:

答案 0 :(得分:3)

怎么样

dta <- structure(c(0.02, 0.01, 0, 0.08, 0.18, 0.01, 0.12, 0, 0.03, 0, 
                   0.95, 0.96, 0.94, 0.97, 0.98, 0.95, 0.99, 0.91, 0.96, 0.98, 
                   0.98, 0.99, 1, 0.92, 0.82, 0.99, 0.88, 1, 0.97, 1, 
                   0.05, 0.04, 0.06, 0.03, 0.02, 0.05, 0.01, 0.09, 0.04, 0.02), 
                   .Dim = c(20L, 2L), .Dimnames = list(NULL, c("1", "2")))

idx <- c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)

dta[cbind(1:nrow(dta), idx)]

我清楚地假设length(idx) == nrow(dta)。如果它们不相等,R将根据需要多次叠加idx,以获得与我们有行相同数量的元素。因此,如果您遗漏了idx的最后一个元素,那么

idx <- c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)
dta[cbind(1:nrow(dta), idx)]

[1] 0.98 0.99 1.00 0.92 0.82 0.99 0.88 1.00 0.97 1.00 0.95 0.96 0.94 0.97 0.98 0.95 0.99 0.91 0.96 0.02

其中最后一个元素是从第二列而不是一个中选取的,因为R再次从idx[1]开始。

答案 1 :(得分:0)

或者:

c(dta[which(idx==2),2], dta[which(idx==1),1])

# [1] 0.98 0.99 1.00 0.92 0.82 0.99 0.88 1.00 0.97 
# 1.00 0.95 0.96 0.94 0.97 0.98 0.95 0.99 0.91 0.96 0.98