R:通过ddply循环stats :: filter

问题描述:

我试图通过分组变量在一些数据上运行一系列不同的过滤器。作为一个例子,这段代码可以在分组变量(齿轮)上生成一个过滤器(0.1)。R:通过ddply循环stats :: filter

library(plyr) 
library(BBmisc) 
mtcars <- mtcars[order(mtcars$gear),] 
mtcars2 <- ddply(mtcars,.(gear),transform,mpgfilter = as.numeric(stats::filter(mpg, filter=0.1, method="recursive"))) 

但我想要一个方法,所以我可以在多个过滤器中进料。我正在考虑将代码嵌套在lapply函数中。举个例子,这里有不同的过滤器(如列表):

newdata <- as.data.frame(seq(from = 0.1, to = 0.9, by = 0.1)) 
newdata <- as.data.frame(t(newdata)) 
colnames(newdata) = newdata[1, ] 
colnames(newdata) <- paste("V", colnames(newdata), sep = "_") 
newlist <- convertColsToList(newdata) 

这里就是我想一个解决方案(没有工作):

newlist3 <- lapply(newlist, function(y){ 
    mtcars2 <- ddply(mtcars,.(gear), transform, mpgfilter = as.numeric(stats::filter(mpg, filter=y, method="recursive"))) 
}) 

有什么建议?我的最终输出将是一个数据框,每列显示不同过滤器的输出。如果有更好的方法,答案不必使用lapply/ddply。

谢谢。

我想我已经回答了一种迂回的方式我自己的问题,使用“通过”功能,而不是ddply:

new <- lapply(newlist, function(y){ 
by(mtcars, mtcars$gear, function(x) mpgfilter = as.numeric(stats::filter(x$mpg, filter=y, method="recursive")))}) 

new2 <- lapply(new, function(y){ 
    resultsdf <- as.data.frame(t(do.call(rbind,y)))}) 
df <- as.data.frame(ldply(new2, data.frame)) 
df2 <- melt(df) 
df2 <- ddply(df2,".id",transform,ID=1:length(.id)) 
finaldata <- dcast(df2, ID + variable ~ .id, value.var = "value") 

有点乱用得到它回到一个可行的数据帧所需的额外工作,但诀窍。