Исключая переменные и те, которые рядом с ними - r dplyr - PullRequest
0 голосов
/ 16 мая 2018

У меня есть набор данных, который является выходом нескольких регистраторов данных, измеряющих температуру и люкс (силу света) с интервалом в 1 час.
Есть ок.250000 точек данных.У меня проблемы с показаниями температуры от «солнечных пятен», когда луч света попадает в регистратор, быстро его нагревает, а затем дает «теплые» показания для остальной части дня.Я могу использовать dplyr для подмножества этих данных (т. Е. LUX> 32 000), но я хотел бы удалить все показания с того дня, если у регистратора было LUX> 32 000 показаний.Для ссылки каждый регистратор данных имеет имя, дату и время переменных.

Есть ли способ сделать это с помощью dplyr?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Вы можете использовать несколько простую функцию, подобную этой:

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 итеративно по всем «известным плохим» пунктам.

0 голосов
/ 16 мая 2018

Если я правильно помню, 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)
...