2017-06-08 5 views
1

私は初心者ですので、問題を説明する際に正しい用語を使用しないことがあります。とにかく私を助けてくれることを願っています。列内の値を以前の値に戻す方法は?

私は、EP.Detect(入り口での動き)、LP.Detect(室内での移動)、R.Detect(ドアが開いているか閉じているか、移動しているか)存在は0(偽)または1(真)です。

この目的は、人がいつ存在するかを知ることです。そして私はいくつかの条件をつけることによってそれをしました。私のコードは正常に動作しますが、「閉じた」場合は例外です。

私の問題は、ドアが開いていないので、それはR.Detectが閉じられ、EP.DetectとLP.Detectタイムアウトであるとき、それはプレゼンスが0であることを意味するわけではないことを理解していないということですかその人はまだ存在しています。

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

が必要なものを取得する必要がありますが、テキスト形式のデータの代わりに、投稿できます画像?そのようにすれば、コードを再現したり提案したりする方が簡単になります。あなたは 'dput(dft1)'を使ってそれを行うことができます。もしデータが大きすぎて 'head(dput(dft1))'を実行できない場合は – Bea

+0

.txtとしてアップロードしようとしました。私はdput(dft1)やhead(dput1)をどこで行うべきかわかりません:// –

+0

'dput()'はR関数です – Bea

答えて

1

あなたがループのいずれかを使用することなく、dplyrのcase文ではるかにきれいにこれを達成することができるかもしれません。

library(dplyr) 

dft1 <- dft1 %>% 
     mutate(Presence = case_when(# If R.Detect is "moved" or "open" or "closed" 
            # AND ( (EP.Detect on previous row is "Movement" AND LP.Detect on previous row is "Movement" or "TimeOut) 
            #  OR (EP.Detect on previous row is "TimeOut" AND LP.Detect on previous row is "Movement") 
            # ) 
            # THEN set Presence to 1 
            .$R.Detect %in% c("moved","open", "closed") 
            & ( (lag(.$EP.Detect) == "Movement" & lag(.$LP.Detect) %in% c("Movement","TimeOut")) 
             | (lag(.$EP.Detect) == "TimeOut" & lag(.$LP.Detect) == "Movement") 
            ) ~ 1, 
            # All other cases, set Presence to 0 
            TRUE ~ 0 
            ) 
      ) 

あなたが特定の理由で、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 
    } 
} 
+0

Ohh yea ..間違いなく私よりもよく見えます... おそらく最後のコードをもっと説明できますか?私はなぜ最初のものだけのためにc( "Movement"、 "TimeOut")を持っているのか分かりません。 –

+0

申し訳ありませんが、実際には私の間違いでした。私はEP変数とLP変数を混同していました。私はそれを修正するための答えを更新し、説明的なコメントを追加しました。 –

+0

Thxxx a loot!それは今私にとってもっと理にかなっています:D –

関連する問題