动态生成未计算的表达式以创建滞后的data.frame?
我有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
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