簡體   English   中英

如何在R中使用多個條件和日期時間編寫for循環

[英]How to write a for loop in R with multiple criteria and datetimes

我正在嘗試編寫一個for循環,該循環將子集滿足某些條件的數據。 相距不到7分鍾的日期/時間也具有兩個不同的方向(上下和上下),且長度差小於4。這就是數據集的樣子。

樣本數據

>    DateTime  Length  Direction
>    4/3/2014 14:43 90  Up
>    4/3/2014 14:45 92  Down
>    4/3/2014 14:46 97  Up
>    4/3/2014 14:49 199 Up
>    4/3/2014 14:50 200 Up
>    4/3/2014 14:55 202 Down

我格式化了日期:

data$DateTime<-as.POSIXlt(data$DateTime,format="%m/%d/%y %H:%M",tz="US/Pacific")

我當時想我可以在for循環中使用difftime來計算時間差,然后為其他條件添加其他if語句,但是我在設置它時遇到了麻煩。 誰能提供任何幫助?

這是一個很好的例子,說明何時for循環會很好,但矢量化會更快並且可以說更簡單。

對於數據集,真正檢查它有點困難,因為除了第一行以外的所有內容都符合您的條件(因為所有行的差異或翻轉方向均小於4分鍾)。

從您的數據開始:

data <- data.frame(
    DateTime = strptime(c("04/03/2014 14:43", "04/03/2014 14:45", "04/03/2014 14:46", "04/03/2014 14:49", "04/03/2014 14:50", "04/03/2014 14:55"), '%m/%d/%Y %H:%M'), 
    Length = c(90L, 92L, 97L, 199L, 200L, 202L),
    Direction = c("Up", "Down", "Up", "Up", "Up", "Down"))

基本功能

首先, difftime需要兩個單獨的參數,因此與diff不同,我們需要明確。 幸運的是,它接受兩個向量,而不僅僅是兩個值,因此我們可以headtail使用負數n (請參閱help(head) )。 (這也可以通過用as.numeric轉換日期來輕松實現,但我認為您希望保留as.numeric 。)

(minutesDiff <- c(Inf, difftime(tail(data$DateTime, n = -1),
                                head(data$DateTime, n = -1),
                                units = 'mins')))
## [1] Inf   2   1   3   1   5

(dirToggle <- c(FALSE, tail(data$Direction, n = -1) != head(data$Direction, n = -1)))
## [1] FALSE  TRUE  TRUE FALSE FALSE  TRUE

## these meet your criteria
which((minutesDiff < 4) | ((minutesDiff < 7) & dirToggle) )
## [1] 2 3 4 5 6

您說過“過濾掉”可以用任何一種方式解釋,但是切換起來很容易。

data[(minutesDiff < 4) | ((minutesDiff < 7) & dirToggle), ]
##              DateTime Length Direction
## 2 2014-04-03 14:45:00     92      Down
## 3 2014-04-03 14:46:00     97        Up
## 4 2014-04-03 14:49:00    199        Up
## 5 2014-04-03 14:50:00    200        Up
## 6 2014-04-03 14:55:00    202      Down

data[! ((minutesDiff < 4) | ((minutesDiff < 7) & dirToggle)), ]
##              DateTime Length Direction
## 1 2014-04-03 14:43:00     90        Up

dplyr

如果您喜歡冒險,並且想和dplyr一起玩,那可以像下面這樣工作:

library(dplyr)
data %>%
    mutate(minutesDiff = c(Inf, difftime(tail(data$DateTime, n = -1),
                                         head(data$DateTime, n = -1),
                                         units = 'mins')),
           dirToggle = c(FALSE, tail(Direction, n = -1) != head(Direction, n = -1))) %>%
    filter(((minutesDiff < 7) & dirToggle) | (minutesDiff < 4)) %>%
    select(DateTime, Length, Direction)
##              DateTime Length Direction
## 1 2014-04-03 14:45:00     92      Down
## 2 2014-04-03 14:46:00     97        Up
## 3 2014-04-03 14:49:00    199        Up
## 4 2014-04-03 14:50:00    200        Up
## 5 2014-04-03 14:55:00    202      Down

(如果您想就地查看mutate d列,只需刪除最后的select子句即可。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM