Исключая переменные и те, которые рядом с ними

У меня есть набор данных, который является выходом нескольких регистраторов данных, измеряющих температуру и люкс (силу света) с интервалом в 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 итеративно по всем "известным плохим" пунктам.

Другие вопросы по тегам