【问题标题】:Applying a function to a list of indexes of a vector?将函数应用于向量的索引列表?
【发布时间】:2019-11-04 14:59:57
【问题描述】:

我有一个长度为n 的向量X,以及一个可变长度的索引列表L。让F 成为从 R^m 到 R 的函数。我想将函数 F 应用于每个子向量 X[L[[i]]。这是,我要计算F( X[ L[[i]] ] )

例如,假设F 是平均值

set.seed(123)
X <- rnorm(100)
L <- list()
for(i in 1:10) L[[i]] <- sample(1:100,30,replace = FALSE)

我可以通过蛮力计算

out <- vector()
for(i in 1:10) out[i] <- mean(X[ L[[i]] ])

但是,对于较大的维度,此 for 循环相当慢。我想知道是否有更直接的计算方法?我曾尝试使用lapply,但它似乎不适用于向量 + 索引列表 + 函数的组合。

【问题讨论】:

  • 试试lapply(L, function(i) mean(X[i]))
  • @Sotos 这似乎可以解决问题。如果您发表评论作为答案,我会接受。
  • @SnoopDogg 请记住,直接方式可能不是最快的
  • @slava-kohut 有趣的评论。我会看看运行时间。
  • @SnoopDogg 使用 vector(n, mode = "list") 创建要填充的向量。这样可以避免在内存中进行昂贵的复制。

标签: r list function for-loop


【解决方案1】:

您可以简单地使用lapply 循环遍历您的列表,并使用每个元素对您的向量X 进行子集化。一旦你子集,计算平均值,即

lapply(L, function(i) mean(X[i]))

【讨论】:

  • 我认为这不会比 for 循环更快(但我可能错了)。你能发布一些时间吗?
  • 我不怀疑您回答的质量。 OP 的最终目标是加快计算速度,他们希望通过lapply 实现这一目标(我对此表示怀疑)。函数形式无所谓。
  • 在我的具体应用中,一次评估从 95 秒变为 71 秒(在使用 lapply 而不是 for 之后)。我不确定这是否是一个普遍的改进,或者与我实现该功能的方式有关,这有几行长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多