如何为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
答案 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)
创建l
和k
的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
并指明宽度。