R-使用指数向量对矩阵进行子集

  • 本文关键字:子集 指数 向量 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。我希望最可能的簇的成员价值的向量来生成集群图的透明颜色。

怎么样
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

自从再次启动idx[1]以来,从第二列中选择了最后一个元素。

或替代:

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

最新更新