xts - удалить строки на основе определенных критериев - PullRequest
0 голосов
/ 22 ноября 2018

Мне нужно удалить строки xts на основе определенных критериев в столбце [code].Хорошо, что при удалении будут временные промежутки во временном ряду xts.

Вопрос: Как мне решить step1 / step3 / step4.


Критерии следующие:

Шаг 1: Значение [3] в [code]: Если xts начинается с [code] [3], удалите эту строку.

Шаг 2: значение [0] в [код]: Удалить всю строку.

Шаг 3: значение [2] в [код]: a) Оставьте только [2], который запускает xts, все строки над первым [2] должны быть удалены.б) Держите [2], который имеет [3] над собой.

Шаг 4: значение [3] в [code]: Оставьте только [3], над которым [2].

Мое решение для шага 2:

Находит и сохраняет все [2] и [3], таким образом удаляя все [0]:

xts3 <- xts3[grep("[2]|[3]", xts3$code), ] 

My R-file:

dates <- as.POSIXct( # Construct the dates to be used.
  c(
  "2013-07-24 09:01:00", 
  "2013-07-24 09:02:00", 
  "2013-07-24 09:03:00",
  "2013-07-24 09:04:00",
  "2013-07-24 09:05:00",
  "2013-07-24 09:06:00",
  "2013-07-24 09:07:00",
  "2013-07-24 09:08:00",
  "2013-07-24 09:09:00"
  )
  )

code <- c(3, 2, 0, 2, 2, 2, 3, 3, 3) # Criterias for delete/keep rows.

data <- data.frame(code) # Create a dataframe.

xts3 <- xts(x=data, order.by=dates) # Create xts based on dataframe.

Результат R-файла (до удаления строк на основе критериев):

                    code
2013-07-24 09:01:00    3
2013-07-24 09:02:00    2
2013-07-24 09:03:00    0
2013-07-24 09:04:00    2
2013-07-24 09:05:00    2
2013-07-24 09:06:00    2
2013-07-24 09:07:00    3
2013-07-24 09:08:00    3
2013-07-24 09:09:00    3

Объяснение: Что должно вызывать удаление строк (на основе критериев):

                    code
2013-07-24 09:01:00    3 # To be removed due to step-1.
2013-07-24 09:02:00    2 # To be kept due to step-3a.
2013-07-24 09:03:00    0 # To be removed due to step-2
2013-07-24 09:04:00    2 # To be removed due to not fulfilling step-3b
2013-07-24 09:05:00    2 # To be removed due to not fulfilling step-3b
2013-07-24 09:06:00    2 # To be removed due to not fulfilling step-3b
2013-07-24 09:07:00    3 # The kept due to step-4
2013-07-24 09:08:00    3 # To be removed due to not fulfilling step4.
2013-07-24 09:09:00    3 # To be removed due to not fulfilling step4.

Ожидаемый результат после удаления строк:

                    code
2013-07-24 09:02:00    2
2013-07-24 09:07:00    3

1 Ответ

0 голосов
/ 22 ноября 2018

Если у вас есть только 0, 2 и 3 в качестве значений, вы можете использовать diff, чтобы получить большинство правил за один раз.Нужны только те записи, где разница составляет 1 (2 выше 3) или -1 (3 выше 2).Таким образом, абсолютное значение diff будет тем, что нам нужно.И нам нужна первая строка, где значение равно 2. Те, которые мы объединяем, чтобы получить результат xts3_filtered.xts3_filtered <- c (xts3 [first (which (xts3 $ code == 2))], xts3 [abs (diff (xts3 $ code)) == 1]) </p>

                    code
2013-07-24 09:02:00    2
2013-07-24 09:02:00    2
2013-07-24 09:07:00    3

Теперь у нас естьдублирующаяся строка, потому что оба правила выбирают запись, в которой встречаются первые 2.Поэтому мы удаляем любые дубликаты с помощью следующего кода

xts3_filtered[!duplicated(index(xts3_filtered))]
                   code
2013-07-24 09:02:00    2
2013-07-24 09:07:00    3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...