我正在刷新我的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
来完成上述过程?
答案 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()
电话:
MARGIN = 1
,'*'()
函数FUN = '*'
c(5,10)
提供第二个参数'*'()
,我们通过...
的{{1}}参数执行此操作。唯一需要注意的是apply()
如何将每个“迭代”产生的向量粘在一起;这里它们是按列方式绑定的,因此我们需要转换apply()
的结果,以便得到与apply()
相同的输出。