如何将自定义函数累积应用于R中的向量?以高效和惯用的方式?

时间:2014-02-15 11:12:28

标签: r vectorization

我知道R中的函数cumsum,它计算了它的向量参数的累积和。

我需要“累积应用”而不是sum函数,而是一个泛型函数,在我的特定情况下,quantile函数。

我目前的解决方案基于循环:

set.seed(42)
df<-data.frame(measurement=rnorm(1000),upper=0,lower=0)
for ( r in seq(1,nrow(df))){
  df$upper[r]<-quantile(df[seq(1,r),"measurement"],c(.99))
  df$lower[r]<-quantile(df[seq(1,r),"measurement"],c(.01))
}

x=seq(1,nrow(df))
plot(df$measurement,type="l",col="grey")
lines(x,df$upper,col="red")
lines(x,df$lower,col="blue")

enter image description here

它有效,但效率不高,我觉得在R中应该有更惯用的方法。

1 个答案:

答案 0 :(得分:1)

您可以使用此方法:

set.seed(42)
df <- data.frame(measurement = rnorm(1000))

res <- sapply(seq(nrow(df)), function(x) 
  quantile(df[seq(x), "measurement"], c(.01, .99)))

它创建一个矩阵,其中nrow(df)列和2行,第1百分位数为一行,第99百分位数为一行。

您可以将此信息添加到数据框df(作为两个列):

df <- setNames(cbind(df, t(res)), c(names(df), "lower", "upper"))