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

时间:2015-04-30 15:51:49

标签: r list indexing

我有一个简单的矩阵(通过X2 [,[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

然后我创建了一个列表"索引"我需要保留所有索引

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

$colB
561 562 
  4   5 

$colC
338 339 
  1   2 

我现在需要只选择inxes指向的值以进行进一步的计算。我不想使用另一个for循环,因为我已经在其中,程序可能运行得非常慢。我试图实现像

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

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

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

2 个答案:

答案 0 :(得分:3)

也许试试这个

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

答案 1 :(得分:3)

尝试

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"))