如何使用值列表作为矩阵的索引?

How to use a list of values as indexes on a matrix?

我有一个简单的矩阵(通过 X2[take[conval]] 访问,因为它是原始矩阵的子集)是这样制作的

Names             ColA                  ColB                ColC
338               0.03125               0.31250             0.03125
339               0.03125               0.31250             0.03125
518               0.03125               0.43750             0.06250
561               0.03125               0.03125             0.68750
562               0.03125               0.03125             0.68750

然后我创建了一个列表"indexes",其中包含我需要保留的所有索引

$colA
338 339 518 561 562 
  1   2   3   4   5 

$colB
561 562 
  4   5 

$colC
338 339 
  1   2 

我现在只需要 select 索引指向的值以进行进一步计算。我不想使用另一个 for 循环,因为我已经在一个循环中,而且程序可能 运行 非常慢。我试图实现类似

的东西
X2[,take[conval]][indexes]

sapply(X2[,take[conval]],"[",indexes)

但显然它不起作用,因为索引是一个列表。 长话短说,我需要 select 第一列中的所有元素,第二列中的最后两个元素和第三列中的前两个元素,没有 for 循环。有什么想法吗?

也许试试这个

dd <- read.table(header = TRUE, text="Names             ColA                  ColB                ColC
338               0.03125               0.31250             0.03125
339               0.03125               0.31250             0.03125
518               0.03125               0.43750             0.06250
561               0.03125               0.03125             0.68750
562               0.03125               0.03125             0.68750")

mm <- as.matrix(dd)
l <- list(ColA = 1:5, ColB = 4:5, ColC = 1:2)

lapply(names(l), function(x) mm[l[[x]], x])

# [[1]]
# [1] 0.03125 0.03125 0.03125 0.03125 0.03125
# 
# [[2]]
# [1] 0.03125 0.03125
# 
# [[3]]
# [1] 0.03125 0.03125

尝试

Map(`[`, X2[-1], indexes)
#$ColA
#[1] 0.03125 0.03125 0.03125 0.03125 0.03125

#$ColB
#[1] 0.03125 0.03125

#$ColC
#[1] 0.03125 0.03125

注意:我假设数据集是 data.frame。如果是矩阵,则转为data.frame

Map(`[`, as.data.frame(X2[,-1]), indexes)

如果你想获取vector中的元素,另一种选择是

 X2[,-1][as.matrix(transform(stack(indexes), 
                ind=as.numeric(factor(ind))))]
 #[1] 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125 0.03125

数据

X2 <- structure(list(Names = c(338L, 339L, 518L, 561L, 562L),
ColA = c(0.03125, 
0.03125, 0.03125, 0.03125, 0.03125), ColB = c(0.3125, 0.3125, 
0.4375, 0.03125, 0.03125), ColC = c(0.03125, 0.03125, 0.0625, 
0.6875, 0.6875)), .Names = c("Names", "ColA", "ColB", "ColC"), 
class = "data.frame", row.names = c(NA, -5L))

indexes <- structure(list(colA = structure(1:5,
.Names = c("338", "339", 
"518", "561", "562")), colB = structure(c(4, 5), .Names = c("561", 
"562")), colC = structure(c(1, 2), .Names = c("338", "339"))),
.Names = c("colA", "colB", "colC"))