Вычислить разницу между значениями в последовательных строках по группам

Это мой df (data.frame):

 group value 1 10 1 20 1 25 2 5 2 10 2 15 

Мне нужно рассчитать разницу между значениями в последовательных строках по группам.

Итак, мне нужен такой результат.

 group value diff 1 10 NA # because there is a no previous value 1 20 10 # value[2] - value[1] 1 25 5 # value[3] value[2] 2 5 NA # because group is changed 2 10 5 # value[5] - value[4] 2 15 5 # value[6] - value[5] 

Хотя, я могу справиться с этой проблемой, используя ddply , но это занимает слишком много времени. Это потому, что у меня много групп в моем df . (более 1 000 000 групп в моем df )

Существуют ли другие эффективные подходы к решению этой проблемы?

Таблица data.table может сделать это довольно быстро, используя функцию shift .

 require(data.table) df <- data.table(group = rep(c(1, 2), each = 3), value = c(10,20,25,5,10,15)) #setDT(df) #if df is already a data frame df[ , diff := value - shift(value), by = group] # group value diff #1: 1 10 NA #2: 1 20 10 #3: 1 25 5 #4: 2 5 NA #5: 2 10 5 #6: 2 15 5 setDF(df) #if you want to convert back to old data.frame syntax 

Или используя функцию lag в dplyr

 df %>% group_by(group) %>% mutate(Diff = value - lag(value)) # group value Diff #    # 1 1 10 NA # 2 1 20 10 # 3 1 25 5 # 4 2 5 NA # 5 2 10 5 # 6 2 15 5 

Для альтернатив pre- data.table::shift и pre- dplyr::lag , см. dplyr::lag .

Вы можете использовать базовую функцию ave() для этого

 df <- data.frame(group=rep(c(1,2),each=3),value=c(10,20,25,5,10,15)) df$diff <- ave(df$value, factor(df$group), FUN=function(x) c(NA,diff(x))) 

который возвращается

  group value diff 1 1 10 NA 2 1 20 10 3 1 25 5 4 2 5 NA 5 2 10 5 6 2 15 5 

попробуйте это с помощью

 df$diff<-as.vector(unlist(tapply(df$value,df$group,FUN=function(x){ return (c(NA,diff(x)))}))) 
  • Интерпретация "имеет длину> 1" предупреждение от функции `if`
  • Как увеличить количество столбцов с помощью R в Linux
  • Разверните строки по дате с использованием даты начала и окончания
  • Как найти разницу в стоимости в каждых двух последовательных строках в R?
  • вытащить p-значения и r-квадрат из линейной регрессии
  • Добавить столбец «ранг» в кадр данных
  • как найти верхние значения N по группам или внутри категории (по группам) в R.frame
  • Изменение имени переменной в цикле for с использованием R
  • Возвращаемый индекс наименьшего значения в векторе?
  • Матрица корреляции сюжетов в граф
  • Объедините (rbind) кадры данных и создайте столбец с именем исходных кадров данных
  • Interesting Posts
    Давайте будем гением компьютера.