R: функция условного различия

#r #group-by #diff

#r #сгруппировать по #разница

Вопрос:

Я хотел бы вычислить последовательные различия между строками переменной фрейма данных в R, точно так же, как diff() функция, однако, только между строками с одинаковым идентификационным номером.

Фиктивные данные:

 id <- c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2)

t1 <- c(4,3,4,4,5,8,9,11,3,8,9,7,9,10,3)

df <- data.frame(id, t1)
 

Используя diff(df$t1) , я получаю:

-1 1 0 1 3 1 2 -8 5 1 -2 2 1 -7

Я бы хотел:

-1 1 0 1 3 1 NA -8 5 1 -2 2 1 -7

Я также пробовал:

 df%>%
  group_by(id)%>%
  diff(df$t1)
 

Но я получаю сообщение об ошибке:

Ошибка в diff.default(., df $ t1): «задержка» и «различия» должны быть целыми числами> = 1

Есть идеи?

Ответ №1:

Однострочное основание R может быть

 ave(df$t1, df$id, FUN = function(x) c(x[-1], NA) - x)
#[1] -1  1  0  1  3  1  2 NA  5  1 -2  2  1 -7 NA
 

Ответ №2:

Вам нужно будет перейти diff() внутрь mutate() инструкции, если вы используете dplyr . Но diff() возвращает вектор, который на 1 короче вашего входного вектора, что затрудняет сохранение одинакового количества строк. Альтернативой является использование dplyr lead() функции для захвата «следующего» значения в группе

 df%>%
  group_by(id)%>%
  mutate(diff=lead(t1)-t1)
 

Ответ №3:

Опция с data.table

 library(data.table)
setDT(df)[, Diff = shift(t1, type = 'lead') - t1, id]