我有数据帧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
, eval
和expression
,无法完成。请注意,我在这里并不关注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