Calculate differences between rows faster than a for loop?

前端 未结 3 784
情书的邮戳
情书的邮戳 2020-12-18 08:32

I have a data set that looks like this:

ID   |   DATE    | SCORE
-------------------------
123  |  1/15/10  |  10
123  |  1/1/10   |  15
124  |  3/5/10   |           


        
3条回答
  •  攒了一身酷
    2020-12-18 09:10

    This should work if your the dates are in order within id.

    id<-c(123,123,124,124)
    date<-as.Date(c('2010-01-15','2010-01-01','2010-03-05','2010-01-05'))
    score<-c(10,15,20,30)
    data<-data.frame(id,date,score)
    
    data <- data[order(data$id,data$date),]
    data$dayssincelast<-do.call(c,by(data$date,data$id,function(x) c(NA,diff(x))))
    # Or, even more concisely
    data$dayssincelast<-unlist(by(data$date,data$id,function(x) c(NA,diff(x))))
    

提交回复
热议问题