Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态生成未计算的表达式以创建滞后的data.frame?_R_Eval_Expression_Plyr - Fatal编程技术网

动态生成未计算的表达式以创建滞后的data.frame?

动态生成未计算的表达式以创建滞后的data.frame?,r,eval,expression,plyr,R,Eval,Expression,Plyr,我有data.frameZ,我只想选择存储在字符向量vars中的几个变量。这当然可以通过以下方式轻松实现: Z[,vars] 问题是我需要这些变量的滞后1和4。我使用lag(变量,-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 va

我有data.frame
Z
,我只想选择存储在字符向量
vars
中的几个变量。这当然可以通过以下方式轻松实现:

Z[,vars]
问题是我需要这些变量的
滞后1和4
。我使用
lag(变量,-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)
如果我调用这个列表元素,我只需要返回字符,但是我当然想要数据本身。最后,我希望
取消列表
,并以包含所有
变量及其各自滞后的data.frame结束

我还玩弄了
substitute
eval
expression
,但没能完成。
注意:我没有把重点放在
mlply
解决方案上,它只是最近向我建议的,我现在可能有点偏见。

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

  • 步骤1:创建
    数据框架的子集
    ——这很简单,您可以在问题中显示出来
  • 步骤2:为
    data.frame中的所有列创建滞后变量
下面是执行步骤2的一种方法。我将使用内置数据集演示:

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如果您提供示例数据和所需的输出,您可能会得到一个很好的解决方案。我认为这更像是语法问题,不知道如何正确使用
表达式
eval
,但数据可能也有帮助。午餐后我将举一个例子:)Thx Andrie。事实上,我把事情复杂化了。也许这是因为我对如何动态粘贴稍后调用的语句感兴趣。使用R SQL包中的
dbGetQuery(statement)
,这一切都很好(当语句是字符向量时)。2.)另外,我想知道在我们的示例中newcol列的用途是什么。为什么不使用
lag()
?是因为忠实不是ts吗?
我没有使用滞后
仅仅是因为我无法让它与
数据一起工作。frame
但毫无疑问你会做得更好!
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