你能用R中的apply实现'sweep'吗?

时间:2014-01-02 02:23:04

标签: r matrix apply

我正在刷新我的R技能,最后觉得我已经掌握了strange sweep function例如。

df <- data.frame(a = 1:3, b = 2:4)
sweep(df, MARGIN = 2, STATS = c(5, 10), FUN = "*")

##    a  b
## 1  5 20
## 2 10 30
## 3 15 40

并且更有用here,关于我正在研究在R中实现空间交互模型的教程。

他们说你明白的一个标志就是你可以用很多方式说出来,而且我认为这在编程中的应用比其他任何地方都要多。然而,尽管sweep解决了看似apply - esque的问题,但我不知道它们在某种程度上是否可以互换。

那么,为了提高我对R的理解,有没有办法使用apply来完成上述过程?

1 个答案:

答案 0 :(得分:6)

这很接近:

t(apply(df, 1, `*`, c(5,10)))

行名称丢失但输出相同

> t(apply(df, 1, '*', c(5,10)))
      a  b
[1,]  5 20
[2,] 10 30
[3,] 15 40

为了解决这个问题,我们假设我们在df的第一行手动执行此操作,我们会写

> df[1, ] * c(5, 10)
  a  b
1 5 20

与使用参数'*'()df[1, ]

调用c(5, 10)函数相同
> '*'(df[1, ], c(5, 10))
  a  b
1 5 20

据此,我们已经足够设置apply()电话:

  1. 我们按行工作,因此MARGIN = 1
  2. 我们应用'*'()函数FUN = '*'
  3. 我们需要向c(5,10)提供第二个参数'*'(),我们通过...的{​​{1}}参数执行此操作。
  4. 唯一需要注意的是apply()如何将每个“迭代”产生的向量粘在一起;这里它们是按列方式绑定的,因此我们需要转换apply()的结果,以便得到与apply()相同的输出。