在dplyr中使用lag()并不像预期的那样工作

时间:2017-02-08 18:22:24

标签: r dplyr

我有以下数据框:

col1<-c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
col2<-c(1,2,3,44,1,1,2,3,44,44,1,2,44,1,44)
df<-data.frame(col1,col2)

我正在尝试按col1条目进行分组,并为col1的每个分组找到等于44的col2的值,然后立即跟随较小的条目(&lt; 44),并在新列中标记这些条目

但是,这段代码似乎不起作用:

df %>% group_by(col1)  %>% mutate(FLAG=(col2==44 & lead(col2,1)<44))

    col1  col2  FLAG
   <dbl> <dbl> <lgl>
1      1     1 FALSE
2      1     2 FALSE
3      1     3 FALSE
4      1    44  TRUE
5      1     1 FALSE
6      2     1 FALSE
7      2     2 FALSE
8      2     3 FALSE
9      2    44 FALSE
10     2    44  TRUE
11     3     1 FALSE
12     3     2 FALSE
13     3    44  TRUE
14     3     1 FALSE
15     3    44    NA

具体来说,条目10应为FALSE,因为它在其后面的同一分组中没有条目&lt; 44。关于如何编写代码的任何建议,这些代码更常用于做我想做的事情?

2 个答案:

答案 0 :(得分:1)

您可以包含lead(col2)可能不是NA的条件。

df %>% 
  group_by(col1)  %>% 
  mutate(FLAG = (col2 == 44 & lead(col2, 1) < 44 & !is.na(lead(col2, 1))))

Source: local data frame [15 x 3]
Groups: col1 [3]

    col1  col2  FLAG
   <dbl> <dbl> <lgl>
1      1     1 FALSE
2      1     2 FALSE
3      1     3 FALSE
4      1    44  TRUE
5      1     1 FALSE
6      2     1 FALSE
7      2     2 FALSE
8      2     3 FALSE
9      2    44 FALSE
10     2    44 FALSE
11     3     1 FALSE
12     3     2 FALSE
13     3    44  TRUE
14     3     1 FALSE
15     3    44 FALSE

答案 1 :(得分:1)

使用if_else

dplyr函数的另一种方法
df %>% group_by(col1)  %>% mutate(FLAG=if_else(col2==44 & lead(col2,1)<44,TRUE,FALSE,missing = FALSE))
# Source: local data frame [15 x 3]
# Groups: col1 [3]
# 
# col1  col2  FLAG
# <dbl> <dbl> <lgl>
# 1      1     1 FALSE
# 2      1     2 FALSE
# 3      1     3 FALSE
# 4      1    44  TRUE
# 5      1     1 FALSE
# 6      2     1 FALSE
# 7      2     2 FALSE
# 8      2     3 FALSE
# 9      2    44 FALSE
# 10     2    44 FALSE
# 11     3     1 FALSE
# 12     3     2 FALSE
# 13     3    44  TRUE
# 14     3     1 FALSE
# 15     3    44 FALSE