【问题标题】:Applying a function to a random sample of vector elements将函数应用于向量元素的随机样本
【发布时间】:2013-10-12 17:51:27
【问题描述】:

这几天我一直在学习 R,想看看下面的问题是否可以比我的解决方案更好地解决(也许更紧凑的代码)。

问题:N (~ 1000) 个数值元素的向量 V,需要按以下方式转换。

  • 随机选择 M (~ 100) 个元素。
  • 将每个此类元素 x 替换为 f(x)

我的解决方案:for (i in sample(1:N, M)) V[i] = f(V[i])

编辑:f 函数将单个数值作为输入,同时也输出单个数值。比如:f <- function (x) x^3 + 2

编辑:感谢大家的贡献!我现在了解了矢量化函数的威力。 :)

【问题讨论】:

  • 你好,可以发一下函数吗?
  • 在原问题中添加了函数定义。
  • 谢谢,我认为确实如此。你可以f 直接指向整个向量,或者像你的情况一样,它的一部分。

标签: r


【解决方案1】:

这个怎么样

   i <- sample(1:N, M)
   V[i] <- f(V[i])

不需要for 循环,因为[&lt;- 是一个向量化函数。请参阅 ?"[&lt;-" 以获取更多详细信息。

【讨论】:

  • 这是假设f是矢量化的。
  • 谢谢,这是一个非常好的解决方案!我面前有来自Rinferno 的“[ 下标摘要”表,但解决方案没有闪现。现在,我意识到这个想法有多么强大。 :-)
【解决方案2】:

这取决于您的函数的类型。如果f 被向量化了,那么

V <- f(V)    #  V is a vector with random numbers

将完成这项工作。如果f 接受并返回单个值,则:

V <- sapply(V, f)

谢天谢地,R 中的大部分函数都是矢量化的,所以第一种方法会经常工作。

【讨论】:

  • 您也可以使用vectorize 向量化您的函数,例如:使用f &lt;- function(i) rep(3,i); Vectorize(f)(1:10)Vectorize(f)(V)
  • @agstudy mmm 非常有趣,谢谢。我认为重要的是要注意它在base&gt; parent.env(environment(f)) &lt;environment: namespace:base&gt; 内部的环境中定义了这个函数包装器,因此将全局环境降低了 2 级。在某些情况下可能会让您有些头疼,比如找不到变量:)
猜你喜欢
  • 1970-01-01
  • 2018-07-17
  • 2013-08-28
  • 2022-11-02
  • 1970-01-01
  • 2020-12-13
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多