Удалить строки значений NA, если они происходят в течение определенного периода времени в цикле, чтобы замедлить? - PullRequest
1 голос
/ 25 июня 2019

Я новичок в R, поэтому прошу прощения, если задаю очевидный вопрос.Я искал в течение недели и не смог найти решение.

У меня есть фрейм данных со множеством столбцов и строк.Теперь я хочу удалить все строки, если:

Столбец A имеет временной диапазон, например, 8 часов, только значения NA. Затем удалите все строки, которые находятся в этом диапазоне.

Фон: Изначально я хотелудалить строки, которые произошли в выходные дни, потому что это не рабочие дни / часы.Но у меня также нет рабочих дней / часов в течение недели, которые происходят "случайно".Поэтому я хочу только данные, где устройство фактически работает.И моя таблица не испорчена из-за этих «пропущенных значений», которые не являются реальными пропущенными значениями.

Единственный фрагмент кода, который я нашел, является следующим:

df[-which(rowMeans(is.na(df)) > 0,3), ]

Я думаю, что таместь возможность изменить этот код в соответствии с моими условиями, но я понятия не имею.На данный момент он просматривает только каждый ряд и решает, есть ли более 30% НС.Но этого недостаточно, потому что у меня есть данные за несколько недель, и я не могу сказать ранее, как часто и в каком временном диапазоне появляются NA.

Вот пример:

df <- data.frame(DateTime = c('2019-05-31 08:23:00', '2019-05-31 09:46:00', '2019-05-31 10:00:00', '2019-05-31 11:07:00', '2019-05-31 11:10:00','2019-05-31 11:56:00', '2019-05-31 12:06:00', '2019-05-31 12:56:00', '2019-05-31 14:16:00', '2019-05-31 15:45:00', '2019-05-31 16:03:00', '2019-05-31 17:05:00', '2019-05-31 18:00:00', '2019-05-31 19:30:00', '2019-05-31 20:01:00'),
             A=c(NA, 1, 2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA ),
             B = c(NA, 2.4, 3, 5, NA, NA, 2.5, NA, NA, 2.6, NA, NA, NA, 1, 2)) 


      DateTime  A   B
1  2019-05-31 08:23:00 NA  NA
2  2019-05-31 09:46:00  1 2.4
3  2019-05-31 10:00:00  2 3.0
4  2019-05-31 11:07:00 NA 5.0
5  2019-05-31 11:10:00 NA  NA
6  2019-05-31 11:56:00 NA  NA
7  2019-05-31 12:06:00 NA 2.5
8  2019-05-31 12:56:00 NA  NA
9  2019-05-31 14:16:00 NA  NA
10 2019-05-31 15:45:00 NA 2.6
11 2019-05-31 16:03:00 NA  NA
12 2019-05-31 17:05:00 NA  NA
13 2019-05-31 18:00:00 NA  NA
14 2019-05-31 19:30:00 NA 1.0
15 2019-05-31 20:01:00 NA 2.0

Дополнительноэто сказать, что у меня нет фиксированного количества строк, соответствующих временному диапазону.Значение NA может встречаться в определенном 8-часовом интервале времени 8,76 или 10 раз.

Вот как я хочу, чтобы это выглядело так:

DateTime             A   B
1  2019-05-31 08:23:00 NA  NA
2  2019-05-31 09:46:00  1 2.4
3  2019-05-31 10:00:00  2  NA
4  2019-05-31 20:01:00  1 2.0

Надеюсь, я правильно описал свою проблему, и кто-то сможет мне помочь.

Спасибо большое!

ОБНОВЛЕНИЕ: Я нашел решение для петли, но оно мучительно медленно.Может кто-то предложить, может быть, что-то быстрее.При количестве строк в 400 тыс. Цикл занимает 1 час ... поэтому с каждым днем ​​количество строк увеличивается, и это не решение для запуска с циклом.

Здесь код: A <- AggregatedTable $ CycleTimer1 D<- AggregatedTable $ DateTime </p>

startIndex = -1

for(i in 1:nrow(AggregatedTable))                    
{ 
  if (is.na(A[i]))                      
  {
    if (startIndex == -1)
    {
      startIndex = i;
    }
  }
  else 
  {         
    if (startIndex != -1)
    {
      lastIndex = i - 1
      if((difftime(D[lastIndex], D[startIndex]) >= 8)) 
      {    
        AggregatedTable <- AggregatedTable[-(startIndex:lastIndex), , drop = FALSE]
      } 
      startIndex = -1
    }
   }
}

1 Ответ

1 голос
/ 25 июня 2019

Мы создаем переменную группировки на основе вхождения NA с rleid и filter на основе количества строк

library(dplyr)
library(data.table)
df %>% 
   group_by(grp = rleid(is.na(A))) %>%
   filter(!(n() >= 8 & all(is.na(A)))) %>%
   ungroup %>%
   select(-grp)
# A tibble: 5 x 3
#  DateTime                A     B
#  <fct>               <dbl> <dbl>
#1 2019-05-31 08:23:00    NA  NA  
#2 2019-05-31 09:46:00     1   2.4
#3 2019-05-31 10:00:00     2  NA  
#4 2019-05-31 11:07:00     3  NA  
#5 2019-05-31 20:01:00     1   2  
...