【问题标题】:How to use a list of values as indexes on a matrix?如何使用值列表作为矩阵的索引?
【发布时间】:2015-07-10 10:16:12
【问题描述】:

我有一个像这样制作的简单矩阵(通过 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

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

$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 循环。有什么想法吗?

【问题讨论】:

  • 你能显示你想要的输出吗?

标签: r list indexing


【解决方案1】:

不妨试试这个

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

【讨论】:

  • 太棒了,这正是我所需要的。
【解决方案2】:

试试

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

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 2020-06-20
    • 1970-01-01
    • 2011-10-18
    • 2019-11-03
    相关资源
    最近更新 更多