2017-02-08 6 views
3

У меня есть следующий кадр данных:Использование лаг() в 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, значения col2, которые являются равным 44 и сразу же следует запись меньшего размера (< 44) и FLAG такие записи в новой колонке.

Однако этот код не кажется, работает:

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, так как он не имеет никаких записей < 44 в той же группировке непосредственно после него. Любые предложения о том, как писать код, который работает в целом, делать то, что я хочу?

+4

я NA в строке 10, когда я запускаю свой код (который является ожидаемым поведением). – eipi10

+0

Я этого не делаю. Ты уверен? Я просто дважды проверял – user85727

+0

Не знаю, почему мой компьютер дает разные результаты. – user85727

ответ

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 
+0

, когда я запустил это, я все еще получаю запись 10 как ИСТИНА. Не уверен что происходит. – user85727

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 
+0

Не знаете, почему ваши решения, похоже, работают, но не на моем компьютере .... – user85727

+1

@ user85727 Возможно, попробуйте обновить R/dplyr? – beetroot

+0

Я думаю, что это может быть проблемой. Странно, он сказал, что у меня установлена ​​последняя версия. – user85727