假设我有一个值矩阵,并且一个向量告诉我,矩阵的每一行,我想访问它(一个!)列。如果没有循环,我如何检索这些值?
数据:
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