如何在列中创建值以回顾先前的值?

时间:2017-06-08 20:02:10

标签: r

我是初学者,所以在解释我的问题时,我可能不会使用正确的术语。希望你能帮助我。

我有一张桌子,包括EP.Detect(入口中的移动),LP.Detect(室内移动),R.Detect(门可以是#34;打开"或者"关闭& #34;或"移动")并且存在为0(假)或1(真)。

这样做的目的是知道一个人何时在场。我通过制定一些条件来做到这一点。我的代码工作正常,除非它来到"关闭"。

我的问题是,它并不了解当R.Detect关闭且EP.Detect和LP.Detect是TimeOut时,它并不意味着Presence为0.因为门庇护所&#39被打开或移动,因此该人仍在场。

  occupied=FALSE    
        j<-1  
        i<-1  
        startRow=1  
        endRow=1  
        n=1  
        for (n in 1:length(dft1$Time)){  
          endRow=n  
        if(dft1$R.Detect[n]=="moved" |dft1$R.Detect[n]=="open" | dft1$R.Detect[n]=="closed"){  

            if(n>1){
              for(i in startRow:endRow){
                if(dft1$R.Detect[n]=="moved" | dft1$R.Detect[n]=="open" ){occupied=TRUE}
                if(dft1$EP.Detect[i]=="Movement" & dft1$LP.Detect[i]=="Movement"){occupied=TRUE}
                if(dft1$EP.Detect[i]=="TimeOut" & dft1$LP.Detect[i]=="Movement"){occupied=TRUE}  
                if(dft1$EP.Detect[i]=="Movement" & dft1$LP.Detect[i]=="TimeOut"){occupied=TRUE}
              }
            }
            for(j in startRow:endRow){dft1$Presence[j]<-occupied}
          }
          startRow=endRow  
          n=n+1  
          occupied=FALSE  
        }  

Tried to upload it as a .txt
It is easier to understand when you look in the picture

structure(list(EP.Detect = c("TimeOut", "TimeOut", "TimeOut", 
"Movement", "Movement", "Movement", "TimeOut", "TimeOut", "Movement", 
"Movement", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "Movement", 
"Movement", "Movement", "Movement", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "Movement", "Movement", "Movement", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "Movement", "Movement", 
"TimeOut", "TimeOut", "TimeOut", "Movement", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "Movement", "Movement", 
"Movement", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "Movement", 
"Movement", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "Movement", "Movement", "Movement", 
"Movement", "Movement", "TimeOut", "Movement", "TimeOut", "TimeOut", 
"TimeOut"), LP.Detect = c("TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "Movement", 
"Movement", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "Movement", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "Movement", "Movement", "Movement", 
"Movement", "Movement", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "Movement", "Movement", "Movement", "Movement", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", 
"TimeOut", "TimeOut", "TimeOut", "TimeOut", "TimeOut", "Movement", 
"Movement", "Movement", "Movement", "TimeOut", "Movement", "Movement", 
"Movement", "Movement", "Movement", "TimeOut", "TimeOut", "TimeOut"
), R.Detect = c("closed", "closed", "open", "moved", "moved", 
"closed", "closed", "closed", "moved", "moved", "closed", "closed", 
"closed", "closed", "closed", "closed", "moved", "moved", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "moved", 
"moved", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "moved", "moved", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"moved", "moved", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "moved", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "closed", "closed", "closed", "closed", 
"closed", "closed", "closed", "open", "closed", "closed", "closed", 
"closed", "moved", "closed", "closed", "closed"), Presence = c(0, 
0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 
0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 0, 0, 0)), .Names = c("EP.Detect", "LP.Detect", 
"R.Detect", "Presence"), row.names = 25550:25727, class = "data.frame")

1 个答案:

答案 0 :(得分:1)

您可以使用dplyr case语句更清晰地完成此操作,而无需使用任何for循环。

# Loop through all rows in the dataframe starting at row 2
for(i in 2:nrow(dft1)){
  # If R.Detect is either "moved", "open", or "closed"
  # AND (   (EP.Detect on the previous row is "Movement" AND LP.Detect on the previous row is either "Movement" or "Timeout")
  #      OR (EP.Detect on the previous row is "TimeOut" AND LP.Detect on the previous row is "Movement")
  #     )
  # Then set Presence to 1
  # Else set Presence to 0
  if(dft1$R.Detect[i] %in% c("moved","open","closed")
     & (  (dft1$EP.Detect[i - 1] == "Movement" & dft1$LP.Detect[i - 1] %in% c("Movement","TimeOut") )
        | (dft1$EP.Detect[i - 1] == "TimeOut" & dft1$LP.Detect[i - 1] == "Movement")
       )
  ){
    dft1$Presence[i] <- 1
  } else{
    dft1$Presence[i] <- 0
  }
}

如果你因为特殊原因需要通过for循环来处理它,那么这个简化的循环应该可以满足你的需要

{{1}}