#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]