Dplyr: lead() и lag() неправильно при использовании с group_by()
Я хочу найти элементы lead() и lag() в каждой группе, но имел некоторые неправильные результаты.
Например, данные выглядят так:
library(dplyr)
df = data.frame(name=rep(c('Al','Jen'),3),
score=rep(c(100, 80, 60),2))
df
Данные:
name score
1 Al 100
2 Jen 80
3 Al 60
4 Jen 100
5 Al 80
6 Jen 60
Теперь я пытаюсь найти оценки lead() и lag() для каждого человека.
Если я сортирую его с помощью аранжировки(), я могу получить правильный ответ:
df %>%
arrange(name) %>%
group_by(name) %>%
mutate(next.score = lead(score),
before.score = lag(score) )
OUTPUT 1:
Source: local data frame [6 x 4]
Groups: name
name score next.score before.score
1 Al 100 60 NA
2 Al 60 80 100
3 Al 80 NA 60
4 Jen 80 100 NA
5 Jen 100 60 80
6 Jen 60 NA 100
Без аорты() результат неверен:
df %>%
group_by(name) %>%
mutate(next.score = lead(score),
before.score = lag(score) )
OUTPUT2:
Source: local data frame [6 x 4]
Groups: name
name score next.score before.score
1 Al 100 80 NA
2 Jen 80 60 NA
3 Al 60 100 80
4 Jen 100 80 60
5 Al 80 NA 100
6 Jen 60 NA 80
Например, в 1-й строке Al next.score должен быть 60 (3-я строка).
Кто-нибудь знает, почему это произошло? Зачем аранжировать() влияет на результат (значения, а не только порядка)? Благодаря ~
Ответы
Ответ 1
Кажется, вам нужно передать дополнительный аргумент в функции задержки и ввода. Когда я запускаю вашу функцию без аранжировки, но с добавлением order_by все выглядит нормально.
df %>%
group_by(name) %>%
mutate(next.score = lead(score, order_by=name),
before.score = lag(score, order_by=name))
Вывод:
name score next.score before.score
1 Al 100 60 NA
2 Jen 80 100 NA
3 Al 60 80 100
4 Jen 100 60 80
5 Al 80 NA 60
6 Jen 60 NA 100
My sessionInfo():
R version 3.1.1 (2014-07-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=Polish_Poland.1250 LC_CTYPE=Polish_Poland.1250 LC_MONETARY=Polish_Poland.1250
[4] LC_NUMERIC=C LC_TIME=Polish_Poland.1250
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] dplyr_0.4.1
loaded via a namespace (and not attached):
[1] assertthat_0.1 DBI_0.3.1 lazyeval_0.1.10 magrittr_1.5 parallel_3.1.1 Rcpp_0.11.5
[7] tools_3.1.1
Ответ 2
Использование order_by является хорошим, когда у вас есть только одна переменная группировки. В случае множественной переменной группировки я не мог найти какое-либо решение, кроме как писать и читать таблицу, чтобы избавиться от группировки переменных. Он работал очень хорошо для меня, но его эффективность зависит от размера таблицы.
Ответ 3
Может случиться так, что вместо этого будет использоваться stats::lag
(например, при восстановлении сред с помощью пакета session
). Это может легко проскользнуть незамеченным, так как не приведет к ошибке при использовании, как в вопросе. Проверьте еще раз, просто набрав lag
, используйте conflicted
пакет или устраните неоднозначность вызова функции, вызвав вместо этого dplyr::lag
.