我有一个简单的矩阵(通过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循环。有什么想法吗?
答案 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"))