我有以下数据框:
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。关于如何编写代码的任何建议,这些代码更常用于做我想做的事情?
答案 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