R - Dplyr - Сравнение значений из последней строки vs фактической строки

У меня есть этот фрейм данных:

year month UserID
1 2014 11 3527
2 2014 12 4916
3 2015 1 2445

И хочу добавить столбец "Вариация": Формула будет: ActualRow/LastRow - 1.

Это мой код:

UserID_unicos2 <- UserID_unicos1 %>%
 mutate(variation=(UserID/lag(UserID) - 1)) %>% 
 mutate(prev=lag(UserID))

Однако он просто возвращает:

year month UserID variation prev
1 2014 11 3527 NA NA
2 2014 12 4916 0.3938191 3527
3 2015 1 2445 NA NA

Как вы видите, он просто возвращает значения для 2014-12. И не для: 2015-01. Как так? Спасибо.

Мои данные после применения "dput()":

structure(list(year = c(2014L, 2014L, 2015L), month = c(11L, 
12L, 1L), UserID = c(3527L, 4916L, 2445L)), .Names = c("year", 
"month", "UserID"), row.names = c(NA, -3L), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), vars = list(year), drop = TRUE, indices = list(
 0:1, 2L), group_sizes = c(2L, 1L), biggest_group_size = 2L, labels = structure(list(
 year = 2014:2015), class = "data.frame", row.names = c(NA, 
-2L), .Names = "year", vars = list(year)))
1 ответ

Согласно вашему dput, ваши данные сгруппированы по year, и именно поэтому вы видите этот результат. Вместо этого попробуйте:

UserID_unicos1 %>%
 ungroup() %>%
 mutate(variation=(UserID/lag(UserID) - 1),
 prev=lag(UserID))

Также обратите внимание, что вы можете создать оба столбца в одном и том же mutate, просто разделенном запятой.

licensed under cc by-sa 3.0 with attribution.