动态生成未求值表达式以创建滞后数据帧



我有数据帧Z,我想只选择存储在字符向量vars中的几个变量。当然,这可以很容易地完成:

Z[,vars]

问题是我还需要这些变量的lags 1 and 4。我用lag(variable,-1)来得到它们。我尝试了下面的建议,在这里之前:

require(plyr)
l <- c(0,1,4)
expand.grid(x=vars,l=l)
# which results in 
  x      l
var1     0
var2     0
var3     0
var1     1
var2     1
var3     1
var1     4
var2     4
var3     4
buildFaDf <- function(x,l) paste("lag(Z$",x,",-",l,")",sep="")
test <- mlply(vars,buildFaDf)

返回如下列表:

.... 
$`4`
[1] "lag(Z$var1,-1)"

如果我调用list元素,我只会得到字符,当然我想要的是数据本身。最后,我想要unlist,并以包含所有vars及其各自滞后的数据帧结束。

我也玩了substitute, evalexpression,无法完成。请注意,我在这里并不关注mlply解决方案,它只是最近有人向我建议的,我现在可能有点偏见。

也许你把问题复杂化了。在我看来,解决这个问题有两个步骤:

  • 步骤1:创建data.frame的子集-这是微不足道的,你在你的问题中显示它。
  • 步骤2:为data.frame
  • 中的所有列创建滞后变量

这是执行步骤2的一种方法。我将使用内置数据集faithful:

进行演示
data(faithful)
dat <- head(faithful, 10)
lag1 <- function(x) c(NA, head(x, -1))
lag4 <- function(x) c(rep(NA, 4), head(x, -4))
data.frame(
  dat,
  llply(dat, lag1),
  llply(dat, lag4)
)
   eruptions waiting eruptions.1 waiting.1 eruptions.2 waiting.2
1      3.600      79          NA        NA          NA        NA
2      1.800      54       3.600        79          NA        NA
3      3.333      74       1.800        54          NA        NA
4      2.283      62       3.333        74          NA        NA
5      4.533      85       2.283        62       3.600        79
6      2.883      55       4.533        85       1.800        54
7      4.700      88       2.883        55       3.333        74
8      3.600      85       4.700        88       2.283        62
9      1.950      51       3.600        85       4.533        85
10     4.350      85       1.950        51       2.883        55

要将解决方案转换为既可以进行子集设置又可以进行滞后的函数,请执行以下操作:

dat <- data.frame(head(faithful, 10), newcol=LETTERS[1:10])
laggedDF <- function(x, vars){
  lag1 <- function(x) c(NA, head(x, -1))
  lag4 <- function(x) c(rep(NA, 4), head(x, -4))
  dat <- x[, vars, drop=FALSE]
  print(dat)
  data.frame(
    dat,
    llply(dat, lag1),
    llply(dat, lag4)
  )
}
laggedDF(dat, vars=c("eruptions", "newcol"))
   eruptions newcol eruptions.1 newcol.1 eruptions.2 newcol.2
1      3.600      A          NA       NA          NA       NA
2      1.800      B       3.600        1          NA       NA
3      3.333      C       1.800        2          NA       NA
4      2.283      D       3.333        3          NA       NA
5      4.533      E       2.283        4       3.600        1
6      2.883      F       4.533        5       1.800        2
7      4.700      G       2.883        6       3.333        3
8      3.600      H       4.700        7       2.283        4
9      1.950      I       3.600        8       4.533        5
10     4.350      J       1.950        9       2.883        6

最新更新