如何使用值列表作为矩阵的索引?
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"))
我有一个简单的矩阵(通过 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"))