dplyr:lead() 和 lag() 与 group_by() 一起使用时出错
dplyr: lead() and lag() wrong when used with 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() 分数。
如果我使用 arrange() 对其进行排序,我可以获得正确答案:
df %>%
arrange(name) %>%
group_by(name) %>%
mutate(next.score = lead(score),
before.score = lag(score) )
输出 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
没有arrange(),结果是错误的:
df %>%
group_by(name) %>%
mutate(next.score = lead(score),
before.score = lag(score) )
输出 2:
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 行)。
有人知道为什么会这样吗?为什么 arrange() 会影响结果(值,而不仅仅是顺序)?谢谢~
看来您必须将额外的参数传递给滞后和前导函数。当我运行你的功能没有安排,但添加了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
我的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
当您只有一个分组变量时,使用 order_by 比较好。在多个分组变量的情况下,除了写入和读取 table 以摆脱分组变量之外,我找不到任何解决方案。它对我来说效果很好,但它的效率取决于 table.
的大小
可能会使用 stats::lag
代替(例如,当使用 session
包恢复环境时)。这很容易被忽视,因为它在问题中使用时不会引发错误。 Double-check 只需键入 lag
,使用 conflicted
包,或通过调用 dplyr::lag
来消除函数调用的歧义。
如果您在会话中加载了 plyr
包,plyr::mutate
也会发生同样的情况。因此,请确保您也在调用 dplyr::mutate
.
我想在每个组中找到 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() 分数。 如果我使用 arrange() 对其进行排序,我可以获得正确答案:
df %>%
arrange(name) %>%
group_by(name) %>%
mutate(next.score = lead(score),
before.score = lag(score) )
输出 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
没有arrange(),结果是错误的:
df %>%
group_by(name) %>%
mutate(next.score = lead(score),
before.score = lag(score) )
输出 2:
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 行)。
有人知道为什么会这样吗?为什么 arrange() 会影响结果(值,而不仅仅是顺序)?谢谢~
看来您必须将额外的参数传递给滞后和前导函数。当我运行你的功能没有安排,但添加了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
我的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
当您只有一个分组变量时,使用 order_by 比较好。在多个分组变量的情况下,除了写入和读取 table 以摆脱分组变量之外,我找不到任何解决方案。它对我来说效果很好,但它的效率取决于 table.
的大小可能会使用 stats::lag
代替(例如,当使用 session
包恢复环境时)。这很容易被忽视,因为它在问题中使用时不会引发错误。 Double-check 只需键入 lag
,使用 conflicted
包,或通过调用 dplyr::lag
来消除函数调用的歧义。
如果您在会话中加载了 plyr
包,plyr::mutate
也会发生同样的情况。因此,请确保您也在调用 dplyr::mutate
.