包含使用日期

时间:2017-08-25 16:46:01

标签: r date if-statement

我正在尝试创建一个函数来应用于数据框中的变量,对于从当前观察向前2天的窗口,如果在该日期窗口中它总是取值1,则更改VarD的值。 / p>

数据框如下所示:

VarA     VarB     Date         Diff   VarD
 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      1  
 1         1      2007-04-18    0      1  
 1         1      2007-04-19    0      1  
 1         1      2007-04-20    0      1  

新数据框应如下所示:

VarA     VarB     Date         Diff   VarD  VarC
 1         1      2007-04-09    NA     0      0
 1         1      2007-04-10    0      0      0
 1         1      2007-04-11   -2      1      1 
 1         1      2007-04-12    0      1      1  
 1         1      2007-04-13    2      0      0  
 1         1      2007-04-14    0      0      0  
 1         1      2007-04-15   -2      1      1  
 1         1      2007-04-16    1      0      0  
 1         1      2007-04-17   -4      1      0  
 1         1      2007-04-18    0      1      0  
 1         1      2007-04-19    0      1      0  
 1         1      2007-04-20    0      1      0  

我尝试过以下代码:

db$VarC <- 0

for (i in unique(db$VarA)) {
 for (j in unique(db$VarB)) {
  for (n in 1 : lenght(db$Date)) {
   if (db$VarD[n] == 0) {db$VarC[n] <- 0}
    else { db$VarC[n] <- ifelse(0 %in% db[(db$Date >=n & db$Date < n+3,]$VarC, 1,0}
}
}

但我在VarC中只获得了零。我没有其他检查代码,它工作正常。如果运行完整代码,则r没有错误。我不知道问题出在哪里。

1 个答案:

答案 0 :(得分:2)

以下是一些替代方案。第一个避免了一些混乱的索引,但最后两个不需要任何包。

1)rollapply 这会将VarC函数以滚动方式应用于db$VarD的每3个元素。 align = "left"表示当x传递给VarC函数时,x[1]是当前元素,x[2]是下一个,x[3]是下一个,即当前元素是最左边的。 partial = TRUE表示如果没有3个元素可用(对于最后一个元素和最后一个元素就是这种情况),那么只需要传递许多元素。

library(zoo)

VarC <- function(x) if (all(x[-1] == 1)) 0 else x[1]
db$VarC <- rollapply(db$VarD, 3, VarC, partial = TRUE, align = "left")

,并提供:

> db
   VarA VarB       Date Diff VarD VarC
1     1    1 2007-04-09   NA    0    0
2     1    1 2007-04-10    0    0    0
3     1    1 2007-04-11   -2    1    1
4     1    1 2007-04-12    0    1    1
5     1    1 2007-04-13    2    0    0
6     1    1 2007-04-14    0    0    0
7     1    1 2007-04-15   -2    1    1
8     1    1 2007-04-16    1    0    0
9     1    1 2007-04-17   -4    1    0
10    1    1 2007-04-18    0    1    0
11    1    1 2007-04-19    0    1    0
12    1    1 2007-04-20    0    1    0

2)sapply 或使用上面的VarC

n <- nrow(db)
db$VarC <- sapply(1:n, function(i) VarC(db$VarD[i:min(i+2, n)]))

3)或使用上面的nVarC

db$VarC <- NA
for(i in 1:n)  db$VarC[i] <- VarC(db$VarD[i:min(i+2, n)])

注意:可重复形式的输入db为:

Lines <- "VarA     VarB     Date         Diff   VarD  VarC
 1         1      2007-04-09    NA     0      0
 1         1      2007-04-10    0      0      0
 1         1      2007-04-11   -2      1      1 
 1         1      2007-04-12    0      1      1  
 1         1      2007-04-13    2      0      0  
 1         1      2007-04-14    0      0      0  
 1         1      2007-04-15   -2      1      1  
 1         1      2007-04-16    1      0      0  
 1         1      2007-04-17   -4      1      0  
 1         1      2007-04-18    0      1      0  
 1         1      2007-04-19    0      1      0  
 1         1      2007-04-20    0      1      0  "
db <- read.table(text = Lines, header = TRUE)