【问题标题】:List comprehension in R: map, not filterR中的列表理解:映射,而不是过滤
【发布时间】:2014-10-02 15:03:34
【问题描述】:

所以,this question 告诉我们如何在 R 中执行列表推导以过滤出新值。

我想知道,编写生成新值的列表理解的标准 R 方法是什么?

基本上,如果我们有一个函数f和向量x,我想要列表f(el) for el in x。 (这就像函数式编程中的地图)。

在 Python 中,这只是[f(el) for el in x]。我如何以标准方式在 R 中编写它?

问题是,现在我有 for 循环:

result = c(0)
for (i in 1:length(x))
{
    result[i] = f(x[i])
}

是否有更类似于 R 的方式来编写此代码,以避免 for 循环的开销?

【问题讨论】:

  • 您正在寻找lapply 或sapply。
  • f 也有可能对向量输入进行操作; x = 1:10; sapply(x, function(X) X + 2); x + 2。顺便说一句,您的“结果”也可以使用已知大小进行初始化:rep(0, length(x))

标签: r performance list-comprehension vectorization idioms


【解决方案1】:

我建议看一下 R 包 rlist,它提供了许多实用功能,使使用列表变得非常容易。例如,你可以写

list.map(x, x ~ x + f(x))

【讨论】:

    【解决方案2】:

    以下没有任何特殊功能的作品:

    > x <- 1:10
    > f <- function(x) {x+log(x)}
    > 
    > f(x)
     [1]  1.000000  2.693147  4.098612  5.386294  6.609438  7.791759  8.945910 10.079442 11.197225 12.302585
    
    > result = f(x)
    > result
     [1]  1.000000  2.693147  4.098612  5.386294  6.609438  7.791759  8.945910 10.079442 11.197225 12.302585
    

    如果 x 是向量,则 f(x) 的结果将是向量。

    > y = 12
    > f(y)
    [1] 14.48491
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 2021-12-08
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多