Я новичок в 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
}
}
}