Условное вычитание по столбцам или строкам во фрейме данных

мне нужно сделать вычитание по столбцам и вычитание по строкам в R.

id    on    fail  
1   10-10-2014  11-11-2014  
1   11-10-2014  12-12-2014  
1   12-10-2014  12-01-2015  
2   13-10-2014  12-02-2015  
2   14-10-2014  15-03-2015  
2   15-10-2014  15-04-2015  
2   16-10-2014  16-05-2015  
3   17-10-2014  16-06-2015  
3   18-10-2014  17-07-2015  
3   19-10-2014  17-08-2015  
3   20-10-2014  17-09-2015 

например, в приведенной выше таблице всякий раз, когда появляется новый идентификатор, он должен выполнять вычитание по столбцам, иначе он должен выполнять вычитание по строкам. Мне нужен такой результат:

id      on        fail     res  
1   10-10-2014  11-11-2014  32  
1   11-10-2014  12-12-2014  31  
1   12-10-2014  12-01-2015  31  
2   13-10-2014  12-02-2015  122  
2   14-10-2014  15-03-2015  31  
2   15-10-2014  15-04-2015  31  
2   16-10-2014  16-05-2015  31  
3   17-10-2014  16-06-2015  242  
3   18-10-2014  17-07-2015  31  
3   19-10-2014  17-08-2015  31  
3   20-10-2014  17-09-2015  31 

на данный момент я использую следующий код:

data[,2] <- as.Date(data[,2],format="%d-%m-%Y")  
data[,3] <- as.Date(data[,3],format="%d-%m-%Y")  
x <- as.numeric(diff(data[,3]))

1 ответ:

DF <- read.table(text="id    on    fail  
1   10-10-2014  11-11-2014  
1   11-10-2014  12-12-2014  
1   12-10-2014  12-01-2015  
2   13-10-2014  12-02-2015  
2   14-10-2014  15-03-2015  
2   15-10-2014  15-04-2015  
2   16-10-2014  16-05-2015  
3   17-10-2014  16-06-2015  
3   18-10-2014  17-07-2015  
3   19-10-2014  17-08-2015  
3   20-10-2014  17-09-2015 ", header=TRUE)

DF[,2:3] <- lapply(DF[,2:3], as.Date, format="%d-%m-%Y")

DF$res <- c(NA, diff(DF$fail))
DF[c(TRUE ,diff(DF$id)!=0), "res"] <- DF[c(TRUE ,diff(DF$id)!=0), "fail"] - 
                                       DF[c(TRUE ,diff(DF$id)!=0), "on"]
#    id         on       fail res
# 1   1 2014-10-10 2014-11-11  32
# 2   1 2014-10-11 2014-12-12  31
# 3   1 2014-10-12 2015-01-12  31
# 4   2 2014-10-13 2015-02-12 122
# 5   2 2014-10-14 2015-03-15  31
# 6   2 2014-10-15 2015-04-15  31
# 7   2 2014-10-16 2015-05-16  31
# 8   3 2014-10-17 2015-06-16 242
# 9   3 2014-10-18 2015-07-17  31
# 10  3 2014-10-19 2015-08-17  31
# 11  3 2014-10-20 2015-09-17  31