【问题标题】:R: Looping a stats::filter through ddplyR:通过 ddply 循环 stats::filter
【发布时间】:2017-06-06 16:24:29
【问题描述】:

我正在尝试通过分组变量对某些数据运行一系列不同的过滤器。例如,此代码用于在分组变量(齿轮)中生成一个过滤器 (0.1)。

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。

谢谢。

【问题讨论】:

    标签: r plyr lapply


    【解决方案1】:

    我想我已经以迂回的方式回答了我自己的问题,使用 'by' 函数而不是 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")
    

    将其恢复到可用的数据帧所需的额外工作有点混乱,但可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      相关资源
      最近更新 更多