Исключая переменные и те, которые рядом с ними
У меня есть набор данных, который является выходом нескольких регистраторов данных, измеряющих температуру и люкс (силу света) с интервалом в 1 час.
Есть ок. 250000 точек данных. У меня проблемы с показаниями температуры от "солнечных пятен", когда луч света попадает на регистратор, быстро его нагревает, а затем дает "теплые" показания для остальной части дня. Я могу использовать dplyr для подмножества этих данных (т. Е. LUX>32 000), но я хотел бы удалить все показания с того дня, если у регистратора было LUX> 32 000 показаний. Для ссылки каждый регистратор данных имеет имя, дату и время переменных.
Есть ли способ сделать это с помощью dplyr?
2 ответа
Если я правильно помню, filter
не очень хорошо работает с сгруппированными данными, поэтому я сначала сортирую фрейм данных по времени (это может не понадобиться, если ваши данные уже отсортированы надлежащим образом). Затем для каждого регистратора и даты я определяю все точки после LUX > 32000
событие и маркировка их. После этого фильтр должен работать.
df %>%
arrange(name, date, time) %>%
group_by(name, date) %>%
mutate(
fleck = cumsum(LUX > 32000) > 0
) %>%
ungroup() %>%
filter(!fleck)
редактировать
Если вы хотите удалить весь день, вы можете изменить способ fleck
переменная определена. Например,
fleck = any(LUX > 32000)
Вы можете использовать несколько простую функцию, например:
beforeafter <- function(lgl, before=1L, after=1L, default=FALSE) {
befores <- if (before > 0L) sapply(seq_len(before), function(i) c(tail(lgl, n=-i), rep(default, i))) else c()
afters <- if (after > 0L) sapply(seq_len(after), function(i) c(rep(default, i), head(lgl, n=-i))) else c()
apply(cbind(befores, lgl, afters), 1, any)
}
vec <- (1:10 == 5)
vec
# [1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
beforeafter(vec)
# [1] FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
beforeafter(vec, before=2, after=0)
# [1] FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE
В качестве примера:
rownames_to_column(mtcars) %>%
select(rowname, cyl, gear) %>%
filter(cyl == 4L, gear == 3L)
# rowname cyl gear
# 1 Toyota Corona 4 3
rownames_to_column(mtcars) %>%
select(rowname, cyl, gear) %>%
filter(beforeafter(cyl == 4L & gear == 3L))
# rowname cyl gear
# 1 Toyota Corolla 4 4
# 2 Toyota Corona 4 3
# 3 Dodge Challenger 8 3
Это хорошо работает, если ваши данные имеют постоянную частоту, и вы хотите удалить все наблюдения в некоторых постоянных выборках из известной проблемы. Он не работает так же хорошо, когда вы хотите "в течение некоторого времени" от данных переменной частоты. Для этого, я думаю, вам понадобится dist
итеративно по всем "известным плохим" пунктам.