【发布时间】:2018-11-14 20:58:20
【问题描述】:
我有一个数据框 (da),其中每一行都有一个按升序排列的时间戳(每个时间戳之间的间隔是随机的)。
我想根据它的时间是否落在其他两个向量(first.times 和 second.times)中的时间范围内来保留 da 的行。所以我会迭代地遍历first.time 和second.time 的向量,看看da 在这些间隔内是否有时间(min = first times 和 max = second.times),我保留这些时间,其余的我没有。
我想出的唯一方法是使用for 循环,但这可能需要一段时间。这是带有一些示例数据的代码:
#Set start and end dates
date1 <- as.POSIXct(strptime('1970-01-01 00:00', format = '%Y-%m-%d %H:%M'))
date2 <- as.POSIXct(strptime('1970-01-05 23:00', format = '%Y-%m-%d %H:%M'))
#Interpolate 250000 dates in between (dates are set to random intervals)
dates <- c(date1 + cumsum(c(0, round(runif(250000, 20, 200)))), date2)
#Set up dataframe
da <- data.frame(dates = dates,
a = round(runif(1, 1, 10)),
b = rep(c('Hi', 'There', 'Everyone'), length.out = length(dates)))
head(da); dim(da)
#Set up vectors of time
first.times <- seq(date1, #First time in sequence is date1
date2, #Last time in sequence is date2
by = 13*60) #Interval of 13 minutes between each time (13 min * 60 sec)
second.times <- first.times + 5*60 #Second time is 5 min * 60 seconds later
head(first.times); length(first.times)
head(second.times); length(second.times)
#Loop to obtain rows
subsetted.dates <- da[0,]
system.time(for(i in 1:length(first.times)){
subsetted.dates <- rbind(subsetted.dates, da[da$dates >= first.times[i] & da$dates < second.times[i],])
})
user system elapsed
2.590 0.825 3.520
我想知道是否有更有效和更快的方法来完成我在for 循环中所做的事情。这个示例数据集运行得非常快,但我的实际数据集每次迭代可能需要 45 秒,并且要进行 1000 次迭代,这可能需要一段时间!
任何帮助都会大有帮助!
谢谢!
【问题讨论】: