应用具有多个参数和变量的函数

时间:2018-02-28 04:12:51

标签: r apply

如何为apply函数提供多个参数和变量?我希望将vectir c(1, 2)传递给参数l和varaibles c(x, x1)参数k

所需的输出应该有四列而不是两列

示例

library(zoo)
datt <- data.frame(x = rnorm(100),
           x2 = rnorm(100))
mapply(function(l, k) c(rollmean(datt[,k], l), rep(NA, l-1)),
       c(1, 2),
       c("x", "x2"))

输出

           x         x2
1 -0.2688922  0.9506357
2  0.1402062  0.7324266
3  0.1391136 -1.7412695
4  1.4542990  2.1617833
5 -0.9409344  2.0495386
6 -0.8309520  0.6403896

2 个答案:

答案 0 :(得分:2)

如果我们必须对多列应用'k',请传递list

中的列
res <- do.call(cbind, Map(function(l, k) rollmean(datt[,k], l, fill = NA), 
           1:2, list(c("x", "x2")))) 

但是,我们没有额外的参数,因为需要循环k参数并且数据子集保持不变

do.call(cbind, lapply(1:2, rollmean, x = datt[c("x", "x2")], fill = NA))

答案 1 :(得分:2)

创建lk的4种组合的网格4x2网格,然后mapply。请注意,我们可以使用fun略微简化fill = NA。请注意width list(1:l)参数意味着将偏移1到l传递给均值。偏移1是下一个值,偏移2是下一个值之后的值。

fun <- function(l, k) rollapply(datt[, k], list(1:l), mean, fill = NA)
g <- expand.grid(l = 1:2, k = c("x", "x2"))
mapply(fun, g[[1]], g[[2]])

更新

根据海报澄清意图的评论,将rollmean更改为rollapply并指明宽度。