与group_by()一起使用时,dplyr:lead()和lag()错误

YJZ*_*YJZ 36 r dplyr

我想在每个组中找到lead()和lag()元素,但是有一些错误的结果.

例如,数据是这样的:

library(dplyr)
df = data.frame(name=rep(c('Al','Jen'),3),
                score=rep(c(100, 80, 60),2))
df
Run Code Online (Sandbox Code Playgroud)

数据:

  name score
1   Al   100
2  Jen    80
3   Al    60
4  Jen   100
5   Al    80
6  Jen    60
Run Code Online (Sandbox Code Playgroud)

现在我试着找出每个人的lead()和lag()得分.如果我使用arrange()对其进行排序,我可以得到正确的答案:

df %>%
  arrange(name) %>%
  group_by(name) %>%
  mutate(next.score = lead(score),
         before.score = lag(score) )
Run Code Online (Sandbox Code Playgroud)

OUTPUT1:

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
Run Code Online (Sandbox Code Playgroud)

没有arrange(),结果是错误的:

df %>%
  group_by(name) %>%
  mutate(next.score = lead(score),
         before.score = lag(score) )
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

例如,在第1行,Al的next.score应为60(第3行).

谁知道为什么会这样?为什么arrange()会影响结果(值,而不仅仅是订单)?谢谢〜

Tom*_*ski 36

看来你必须将额外的参数传递给lag和lead函数.当我在没有安排的情况下运行你的功能,但添加了order_by时,一切似乎都没问题.

df %>%
group_by(name) %>%
mutate(next.score = lead(score, order_by=name),
before.score = lag(score, order_by=name))
Run Code Online (Sandbox Code Playgroud)

输出:

  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
Run Code Online (Sandbox Code Playgroud)

我的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 
Run Code Online (Sandbox Code Playgroud)

  • 我正在处理类似的滞后情况,但有一个更改 - 用于分组和排序的多个列!如果 group_by 和 order_by 中有多个列,答案会有多大不同?我尝试传递向量,但这没有帮助。 (4认同)

Hol*_*ndl 10

可能会stats::lag使用它来代替(例如,当使用session包恢复环境时)。这很容易被忽视,因为它在问题中使用时不会抛出错误。通过简单地键入lag、使用conflicted包或通过调用dplyr::lag来消除函数调用的歧义来仔细检查。

可能会发生同样的情况plyr::mutate,以防您plyr在会话中加载了包。因此,请确保您也在调用dplyr::mutate.

  • 我浪费了最后 2 个小时试图理解应该运行的代码中突然出现的错误,然后才找到强调 dplyr:mutate 和 dplyr:lag 的 GodSend 回复。这需要更多的关注。谢谢你,先生。 (4认同)
  • 许多软件包都有滞后功能 - 正如此评论所述,验证/消除歧义至关重要,除非您只是简单地依赖于一小组软件包或单独的基础 R + dplyr。 (2认同)

Adr*_*ian 6

当只有一个分组变量时,使用 order_by 是很好的选择。如果有多个分组变量,除了写入和读取表以摆脱分组变量之外,我找不到任何解决方案。它对我来说效果很好,但它的效率取决于桌子的大小。

  • 我为此情况创建了一个虚拟分组变量,以允许使用 order_by: `mutate(grouping=sprintf("%04d-%04d",var1,var2)) %>% mutate(next.score = Lead(score, order_by=grouping) ) %>% 选择(-分组)` (4认同)