Another way:
#create four columns with route id, stop sequence interval time and
route start time
ssq <- c( 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 2, 3, 4, 5, 6, 7, 8 )
tint <- c( "00:00", "00:12", "00:03", "00:06", "00:09", "00:02", "00:04"
, "00:00", "00:08", "00:10", "00:10"
, "00:00", "00:02", "00:04", "00:08", "00:02", "00:01", "00:01"
)
tst <- c( rep( "18:20", 7 )
, rep( "10:50", 4 )
, rep( "16:15", 7 ) )
rtid <- c( rep( "a", 7 )
, rep( "b", 4 )
, rep( "c", 7 ) )
# Don't use cbind to make data frames... it usually ends up
# forcing all columns to be character or factors
# Also, avoid using "df" as a variable name... it is the name of
# a function in base R, so that gets confusing fast
DF <- data.frame( ssq, tint, tst, rtid, stringsAsFactors=FALSE )
DF
#correct data set should look like this
tarr <- c( "18:20", "18:32", "18:35", "18:41", "18:50", "18:52", "18:56"
, "10:50", "10:58", "11:08", "11:18"
, "16:15", "16:17", "16:21", "16:29", "16:31", "16:32", "16:33"
)
DF2 <- data.frame( DF, tarr, stringsAsFactors=FALSE )
DF2
library(dplyr)
DFs <- ( DF
%>% group_by( rtid )
%>% mutate( tarr
= as.character( as.POSIXct( tst, format="%H:%M", tz="GMT"
)
+ as.difftime(
cumsum(
as.numeric(
as.difftime( tint, format="%H:%M"
)
, units="mins"
)
)
, units="mins"
)
, format="%H:%M" )
)
%>% as.data.frame # removes grouping behavior from result
)
identical( DFs, DF2 )
On 2015-05-25 15:43, Jim Lemon wrote:
Hi gavinr,
Perhaps this will do what you want.
add_HH_MM<-function(x) {
t1bits<-strsplit(as.character(x$tst),":")
t2bits<-strsplit(as.character(x$tint),":")
hours<-as.numeric(lapply(t1bits,"[",1))+cumsum(as.numeric(lapply(t2bits,"[",1)))
minutes<-as.numeric(lapply(t1bits,"[",2))+cumsum(as.numeric(lapply(t2bits,"[",2)))
next_hour<-minutes > 59
# adjust for running into the next hour
minutes[next_hour]<-minutes[next_hour]-60
hours[next_hour]<-hours[next_hour]+1
# adjust for running into the next day
hours[hours > 23]<-hours[hours > 23]-24
return(paste(formatC(hours,width=2,flag=0),formatC(minutes,width=2,flag=0),sep=":"))
}
df$tarr<-unlist(by(df,df$rtid,add_HH_MM))
Jim
On Tue, May 26, 2015 at 5:28 AM, gavinr <g.ru...@bham.ac.uk> wrote:
I’ve got some transit data relating to bus stops for a GIS data set.
Each
row represents one stop on a route. For each record I have the start
time
of the route, a sequence in which a bus stops, the time the bus
arrives at
the first stop and the time taken to get to each of the stops from the
last
one in the sequence. Not all sequences of stops starts with the
number 1,
some may start with a higher number.
I need to make a new variable which has the time the bus arrives at
each
stop by using the start time from the stop with the lowest sequence
number,
to populate all of the arrival times for each stop in each route.
I have a very simple example below with just three routes and a few
stops in
each. My actual data set has a few million rows. I've also created a
version of the data set I'm aiming to get.
There are two problems here. Firstly getting the data into the
correct
format to do the calculations with
durations, and secondly running a function over the data set to obtain
the
times.
It is the durations that are critical not the date, so using the POSIX
methods doesn’t really seem appropriate here. Ultimately the times
are
going to be used in a route solver in an ArcSDE geodatabase. I tried
to use
strptime to format my times, but could not get them into a data.frame
as
presumably they are a list. In this example I’ve left them as
strings.
Any help is much appreciated.
#create four columns with route id, stop sequence interval time and
route
start time
ssq<-c(3,4,5,6,7,8,9,1,2,3,4,2,3,4,5,6,7,8)
tint<-c("00:00","00:12","00:03","00:06","00:09","00:02","00:04","00:00","00:08","00:10","00:10","00:00","00:02","00:04","00:08","00:02","00:01","00:01")
tst<-c(rep("18:20",7),rep("10:50",4),rep("16:15",7))
rtid<-c(rep("a",7),rep("b",4),rep("c",7))
df<-data.frame(cbind(ssq,tint,tst,rtid))
df
#correct data set should look like this
tarr<-c("18:20","18:32","18:35","18:41","18:50","18:52","18:56","10:50","10:58","11:08","11:18","16:15","16:17","16:21","16:29","16:31","16:32","16:33")
df2<-cbind(df,tarr)
df2
--
View this message in context:
http://r.789695.n4.nabble.com/run-a-calculation-function-over-time-fields-ordered-and-grouped-by-variables-tp4707655.html
Sent from the R help mailing list archive at Nabble.com.
______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.