【发布时间】:2013-06-26 03:18:17
【问题描述】:
我是 R 新手,但是在学习了入门课程并玩了一点之后,我希望它可以 1) 更优雅地解决我的建模目标(与 Excel 相比,这是我的备用计划)和 2 ) 是从这个项目中带走的有用技能。
任务/目标:
我正在尝试使用驾驶日志数据来模拟和模拟电动汽车的潜在能量和温室气体排放。具体来说:
- 我有想要翻译成的驾驶日志数据(开始和结束时间戳,以及数千名司机的其他数据 - 基本示例如下):
- 24 小时时间序列数据,因此对于 24 小时期间的每一分钟,我确切地知道谁在驾驶车辆,以及它属于什么“行程”(对于那个司机)。我这里的问题集中在这个问题上。
我想要的输出类型: 注意:此输出不与下面提供的示例数据相关。我以某天的前十分钟和一些理论旅行为例
对于这个问题不是必需的,但知道可能有用:我将使用上述输出来交叉引用其他特定于驾驶员的数据,以根据与相关的事物计算每分钟的汽油(或电力)消耗量该行程,例如停车位置或行程距离。我想在 R 中执行此操作,但在进行此步骤之前必须先弄清楚上述问题。
我目前的解决方案是基于:
- How to count the number of concurrent users using time interval data?
- How to calculate number of occurrences per minute for a large dataset
问题:
简化数据示例:
a <- c("A","A","A","B","B","B","C","C","C")
b <- c(1, 2, 3, 1, 2, 3, 1, 2, 3)
c <- as.POSIXct(c(0.29167, 0.59375, 0.83333, 0.45833, 0.55347, 0.27083, 0.34375, 0.39236, 0.35417)*24*3600 + as.POSIXct("2013-1-1 00:00") )
d <- as.POSIXct(c(0.334027778, 0.614583333, 0.875, 0.461805556, 0.563888889, 0.295138889, 0.375, 0.503472222, 0.364583333)*24*3600 + as.POSIXct("2013-1-1 00:00"))
e <- c(2, 8, 2, 5, 5, 2, 5, 5, 2)
f <- as.POSIXct(c(0, 0.875, 0, 0.479166666666667, 0.580555555555556, 0.489583333333333, 0.430555555555556, 0.541666666666667, 0.711805555555555)*24*3600 + as.POSIXct("2013-1-1 00:00"))
g <- as.POSIXct(c(0, 0.885, 0, 0.482638888888889, 0.588194444444444, 0.496527777777778, 0.454861111111111, 0.559027777777778, 0.753472222222222)*24*3600 + as.POSIXct("2013-1-1 00:00"))
h <- c(0, 1, 0, 1, 4, 8, 8, 1, 5)
i <- as.POSIXct(c(0, 0, 0, 0.729166666666667, 0.595833333333333, 0.534722222222222, 0.59375, 0.779861111111111, 0.753472222222222)*24*3600 + as.POSIXct("2013-1-1 00:00"))
j <- as.POSIXct(c(0, 0, 0, 0.736111111111111, 0.605555555555556, 0.541666666666667, 0.611111111111111, 0.788194444444445, 0.75625)*24*3600 + as.POSIXct("2013-1-1 00:00"))
k <- c(0, 0, 0, 4, 4, 2, 5, 8,1)
testdata <- data.frame(a,b,c,d,e,f,g,h,i,j,k)
names(testdata) <- c("id", "Day", "trip1_start", "trip1_end", "trip1_purpose", "trip2_start", "trip2_end", "trip2_purpose", "trip3_start", "trip3_end", "trip3_purpose")
在这个示例数据中,我有三个司机(id = A、B、C),他们每个人在三个不同的日子(天 = 1、2、3)开车。请注意,某些司机可能有不同的行程次数。时间戳指示驾驶活动的开始和结束时间。
然后我为一整天(2013 年 1 月 1 日)创建分钟间隔
start.min <- as.POSIXct("2013-01-01 00:00:00 PST")
end.max <- as.POSIXct("2013-01-01 23:59:59 PST")
tinterval <- seq.POSIXt(start.min, end.max, na.rm=T, by = "mins")
在给定用户正在开车的几分钟内插入“1”:
out1 <- xts(,align.time(tinterval,60))
# loop over each user
for(i in 1:NROW(testdata)) {
# paste the start / end times into an xts-style range
timeRange <- paste(format(testdata[i,c("trip1_start","trip1_end")]),collapse="/")
# add the minute "by parameter" for timeBasedSeq
timeRange <- paste(timeRange,"M",sep="/")
# create the by-minute sequence and align to minutes to match "out"
timeSeq <- align.time(timeBasedSeq(timeRange),60)
# create xts object with "1" entries for times between start and end
temp1 <- xts(rep(1,length(timeSeq)),timeSeq)
# merge temp1 with out and fill non-matching timestamps with "0"
out1 <- merge(out1, temp1, fill=0)
}
# add column names
colnames(out1) <- paste(testdata[,1], testdata[,2], sep = ".")
我们的想法是为每次旅行重复此操作,例如out2、out3 等,其中我会用“2”、“3”等填充任何驾驶时段,然后汇总/合并所有生成的 outx 数据帧,最终得到所需结果。
不幸的是,当我尝试为 out2 重复此操作时...
out2 <- xts(,align.time(tinterval,60))
for(i in 1:NROW(testdata)) {
timeRange2 <- paste(format(testdata[i,c("trip2_start","trip2_end")]),collapse="/")
timeRange2 <- paste(timeRange2,"M",sep="/")
timeSeq2 <- align.time(timeBasedSeq(timeRange2),60)
temp2 <- xts(rep(2,length(timeSeq2)),timeSeq2)
out2 <- merge(out2, temp2, fill=0)
}
colnames(out2) <- paste(testdata[,1], testdata[,2], sep = ".")
head(out2)
我收到以下错误:
- UseMethod("align.time") 中的错误:没有适用于 'align.time' 的方法应用于“Date”类的对象
colnames<-(*tmp*, value = c("A.1", "A.2", "A.3", "B.1", "B.2", 中的错误:尝试在具有较少的对象上设置“colnames” 超过二维
我的 out2 代码有什么问题?
我可以了解其他更好的解决方案或软件包吗?
我意识到这可能是一种非常迂回的方式来获得我想要的输出。
任何帮助将不胜感激。
【问题讨论】:
-
testdata的数据是怎么给你的?我问是因为如果数据是长格式会更简单。 -
有一段旅程在开始之前就结束了。
-
@JoshuaUlrich:testdata 是我拥有的数据的一个非常简化的样本,但我将从中提取的基础知识。
标签: r time time-series xts