【问题标题】:apply function with multiple arguments and variables应用具有多个参数和变量的函数
【发布时间】:2018-02-28 04:12:51
【问题描述】:

如何为应用函数提供多个参数和变量?我想将 vectir c(1, 2) 传递给参数 l 并将变量 c(x, x1) 传递给参数 k

Desired Output应该有四列而不是两列

示例

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

【问题讨论】:

  • 如果 l statnds 用于 'k' 参数,则只有两列输出。

标签: r apply


【解决方案1】:

如果我们必须为多个列应用“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))

【讨论】:

  • 谢谢!但是,我需要保留 l-1,因为我将 rollmean 滞后 1。
  • @Vedda 好的,那么您可以删除 fill = NA 并使用您的 rep(NA, l-1)
  • rollapply 中,width= 可以是一个包含偏移向量的单组件列表。这将避免rep。我已经在修改后的答案中证明了这一点,但这种方法也可以在这里合并。
【解决方案2】:

创建一个由lkmapply 的4 个组合组成的4x2 网格。请注意,我们可以使用 fill = NA 稍微简化 fun。请注意,list(1:l)width 参数表示将偏移量 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]])

更新

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2011-10-13
    • 2011-12-24
    • 1970-01-01
    • 2019-06-04
    • 2016-03-16
    • 1970-01-01
    相关资源
    最近更新 更多