dplyr:lead()和lag()与group_by()一起使用时出错
我想在每个组中找到lead()和lag()元素,但得到了一些错误的结果 例如,数据如下所示:dplyr:lead()和lag()与group_by()一起使用时出错,r,dplyr,R,Dplyr,我想在每个组中找到lead()和lag()元素,但得到了一些错误的结果 例如,数据如下所示: library(dplyr) df = data.frame(name=rep(c('Al','Jen'),3), score=rep(c(100, 80, 60),2)) df 数据: 现在我试着找出每个人的lead()和lag()分数。 如果我使用arrange()对其排序,我可以得到正确的答案: df %>% arrange(name) %>%
library(dplyr)
df = data.frame(name=rep(c('Al','Jen'),3),
score=rep(c(100, 80, 60),2))
df
数据:
现在我试着找出每个人的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的下一个分数应该是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
My sessionInfo():
当您只有一个分组变量时,使用order_by是很好的。在多个分组变量的情况下,我找不到任何解决方案,除了编写和读取表以摆脱分组变量。它对我来说非常有效,但其效率取决于表的大小。可能会使用
stats::lag
(例如,在使用会话
包恢复环境时)。这很容易在不被注意的情况下溜过去,因为它不会像问题中那样使用时抛出错误。通过简单地键入lag
进行双重检查,使用conflicted
包,或者通过调用dplyr::lag
来消除函数调用的歧义
同样的情况也可能发生在
plyr::mutate
,以防您在会话中加载了plyr
包。因此,请确保您也在调用dplyr::mutate
@DavidArenburg。这不是排序,OP会询问为什么结果是80,而在原始数据帧中,下一个结果是60。就好像是珍的成绩被选上了,而不是阿尔的成绩,我不能再重复了。您使用的是哪个版本的R?我在Windows上使用R3.1.2获得1 Al 100 60 NA
7@PanagiotisKanavos是的,你是对的。我没有注意到。我可以重现奇怪的结果(0.4.1.9000
)。我认为(在快速、模糊地浏览了一系列函数调用的源代码之后),这是因为底层代码是按实际的总体行索引而不是相对行索引进行的。这也许可以解释lead
(我认为pmin
是奇怪的地方),但不确定lag
(没有看那里)。这似乎是dplyr
的最新版本0.4.1中的一个bug,并且已经有报道说我正在处理一个类似的lag案例,但是有一个改变-多个列用于分组和排序!如果group_by和order_by中有多个列,答案会有多大不同?我尝试传递向量,但没有帮助。我为这种情况创建了一个虚拟分组变量,以允许使用order\u by:mutate(grouping=sprintf(“%04d-”,var1,var2))%%>%mutate(next.score=lead(score,order\u by=grouping)%%>%select(-grouping)
许多软件包都有延迟功能——正如这条评论所述,验证/消除歧义是至关重要的,除非你仅仅依靠一小部分软件包或基本的R+dplyr。在找到这个强调dplyr:muta的天赐回复之前,我浪费了最后两个小时试图理解应该运行的代码中突然出现的错误te和dplyr:滞后。这需要更多的关注。谢谢你,先生。
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
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