我正在尝试创建一个函数来应用于数据框中的变量,对于当前观察前2天的窗口,计算变量以正数变化的天数。
数据框如下所示:
VarA VarB Date Diff
1 1 2007-04-09 NA
1 1 2007-04-10 0
1 1 2007-04-11 -2
1 1 2007-04-12 0
1 1 2007-04-13 2
1 1 2007-04-14 0
1 1 2007-04-15 -2
1 1 2007-04-16 1
1 1 2007-04-17 -4
1 1 2007-04-18 0
1 1 2007-04-17 0
1 1 2007-04-18 0
我想在以下情况下创建一个新变量:
它应如下所示:
VarA VarB Date Diff VarC
1 1 2007-04-09 NA 0
1 1 2007-04-10 0 0
1 1 2007-04-11 -2 1
1 1 2007-04-12 0 1
1 1 2007-04-13 2 0
1 1 2007-04-14 0 0
1 1 2007-04-15 -2 1
1 1 2007-04-16 1 0
1 1 2007-04-17 -4 0
1 1 2007-04-18 0 0
1 1 2007-04-17 0 0
1 1 2007-04-18 0 0
我尝试过以下代码:
db$VarC <- 0
for (i in unique(db$VarA)) {
for (j in unique(db$VarB)) {
subset.data.frame(db, VarA == i & VarB == j)
for (n in 1 : lenght(db$Date)) db$VarC[n] <-
ifelse(db$Diff[n] < 0, 1,
ifelse (db$VarC[n-1] ==1 && db$Diff[n] <0, 1, 0))
}
}
但问题是脚本耗费太多时间。我必须运行它以进行1亿次观测,并且它可以运行数天。我尝试使用dplyr并调用.Last.value函数,如下所示:
db <- db %>% group_by(VarA, VarB) %>% rowwise() %>%
mutate( VarC = ifelse(Diff <0, 1 , ifelse(.Last.value == 1 & Diff <
0, 1, 0))) )
但问题是dplyr
(据我所知,data.table
)无法处理算法中隐含的“检查上一行”。使用lag
也无济于事。我想知道是否有更快的方法可以做到这一点。