Благодаря @Gregor
lead
и lag
- это именно то, что я искал.Я подтверждаю, что lead
и lag
не работают, если даты повторяются, и мне нужно сначала договориться по дате.grepl
удалось решить вопрос о повторении дат.Теперь я должен выяснить, как свернуть счеты.Вот коды для интересующихся
name <- c(rep("adam",3), rep("bob",3), rep("charlie",3), rep("dave",3))
date <- lubridate::date(rep(c(as.Date("2014-01-01"),as.Date("2015-01-01"),as.Date("2015-01-01")),4))
score <- c("C","B","A",
"C","A","B",
"C","A","A",
"C","B","B")
df <- data.frame(name,date,score)
df %>% group_by(name) %>%
filter(any(score %in% c("C") & lead(score %in% c("A")))) %>%
summarize
# A tibble: 2 x 1
# name
# <fct>
# 1 bob
# 2 charlie
df %>% group_by(name, date) %>%
summarize(scores = paste(score, collapse = "")) %>%
group_by(name) %>%
filter(any(grepl("C", scores) & lead(grepl("A", scores))))
# # A tibble: 6 x 3
# # Groups: name [3]
# name date scores
# <fct> <date> <chr>
# 1 adam 2014-01-01 C
# 2 adam 2015-01-01 BA
# 3 bob 2014-01-01 C
# 4 bob 2015-01-01 AB
# 5 charlie 2014-01-01 C
# 6 charlie 2015-01-01 AA
Относительно второго вопроса по парному сравнению.
Я пришел к тому же выводу, что >
не делает парное сравнение.Эти вопросы стали ясны, когда я исследовал, почему функция any
не работает должным образом.
1:3 > 2:4
FALSE FALSE FALSE
Я думаю, что expand.grid
может помочь, но мне нужно больше узнать о функциональном программировании, пакете purrr и научиться связывать их вместе.
filter(min(date[score %in% "B"]) < max(date[score %in% "A"]))
отлично подходит для моих целей.