Reputation: 75
I have some data which looks like this:
id time
1 2013-02-04 02:20:59
1 2013-02-04 02:21:05
1 2013-02-04 02:21:24
2 2013-02-04 02:21:26
2 2013-02-04 02:22:19
2 2013-02-04 02:22:35
I want to take the difference in time for each id between two time values such as for:
id 1 02:21:05-02:20:59=00:00:06.
How can I do this in R?
Upvotes: 3
Views: 552
Reputation: 121568
Here a grouping solution using the base package using by
and transform
transform(dat, res = unlist(by(time,as.factor(id),
FUN=function(x)c(0,diff(x)))))
This will work for a factor id , which is the natural type for a grouping column.
Upvotes: 1
Reputation: 16026
I think this will work, but I'm not entirely clear on your requirement...
df <- data.frame(id = rep(c(1,2), each=3), time=seq(from = as.POSIXct("2013-02-04 02:20:59"), to=as.POSIXct("2013-02-04 02:22:35"),length.out=6))
library(plyr)
df.diff <- ddply(df, .(id), summarise,
difference = diff(as.numeric(time)))
df.diff
# id diff
# 1 1 19.2
# 2 1 19.2
# 3 2 19.2
# 4 2 19.2
Upvotes: 0
Reputation: 17189
You should do diff
on time as well as id
and then using ifelse
populate the third column
df <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L),
time = structure(c(1359915659, 1359915665, 1359915684,
1359915686, 1359915739, 1359915755), class = c("POSIXct",
"POSIXt"), tzone = "")), .Names = c("id", "time"), row.names = c(NA, -6L),
class = "data.frame")
df
## id time
## 1 1 2013-02-04 02:20:59
## 2 1 2013-02-04 02:21:05
## 3 1 2013-02-04 02:21:24
## 4 2 2013-02-04 02:21:26
## 5 2 2013-02-04 02:22:19
## 6 2 2013-02-04 02:22:35
## here you are checking if that result is diff in time only when diff in id is 0
df$result <- c(0, ifelse(diff(df$id) == 0, diff(df$time), 0))
df
## id time result
## 1 1 2013-02-04 02:20:59 0
## 2 1 2013-02-04 02:21:05 6
## 3 1 2013-02-04 02:21:24 19
## 4 2 2013-02-04 02:21:26 0
## 5 2 2013-02-04 02:22:19 53
## 6 2 2013-02-04 02:22:35 16
Upvotes: 3