[英]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
不同,我們需要明確。 幸運的是,它接受兩個向量,而不僅僅是兩個值,因此我們可以head
和tail
使用負數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.