【问题标题】:Ifelse statement with dataframe subset using date使用日期的带有数据框子集的 ifelse 语句
【发布时间】:2018-02-03 18:43:51
【问题描述】:

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

数据框如下所示:

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 中只得到零。我已经检查了没有 else 的代码,它工作正常。如果运行完整的代码,则 r 不会出错。我不知道问题出在哪里。

【问题讨论】:

    标签: r date if-statement


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 感谢 G。它运行良好。我也尝试使用不同的 VarA,如果缺少日期,并且也可以。最后一个问题:VarC 函数中的 x[-1] 是什么意思?再次感谢。
    • x[-1]x,除了它的第一个元素。试试x &lt;- c(11, 24, 100); x[-1]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    相关资源
    最近更新 更多