В [xts1 $ master_decision] я пытаюсь удалить строки, значения которых идентичны значению на одну ячейку выше. Я собираюсь сделать это с помощью R base, не привлекая дополнительных пакетов.

Если есть способ решить эту векторизацию, пропуская цикл for, это тоже хорошо.

# --------------------------------------
# Construct xts data.
# --------------------------------------

rows_to_build <- 6

dates <- seq(
  as.POSIXct("2019-01-01 09:01:00"),
  length.out = rows_to_build,
  by = "1 min",
  tz = "CEST"
  )

master_decision = c(
            # - Clarification what "for-loop" should do:
    3,      # Keep (missing [3] in cell above)
    2,      # Keep (missing [2] in cell above)
    2,      # Delete due to [2] in cell above)
    3,      # Keep (missing [3] in cell above)
    3,      # Delete due to [3] in cell above)
    2       # Keep (missing [2] in cell above)
)

data <- data.frame(master_decision)
xts1 <- xts(x = data, order.by = dates)


rm(list = ls()[! ls() %in% c("xts1")]) # Only keep [xts1].


# ------------------------------------------------------------
# For loop with purpose to remove duplicates that are grouped.
# ------------------------------------------------------------

for (i in 2:nrow(xts1)) {
    if(xts1[[i]] == xts1[[i-1]]) {
        xts1[-c(i)]
    }
}

xts1 до запуска цикла for:

                    master_decision
2019-01-01 09:01:00               3
2019-01-01 09:02:00               2
2019-01-01 09:03:00               2
2019-01-01 09:04:00               3
2019-01-01 09:05:00               3
2019-01-01 09:06:00               2

Результат (строка с отметкой времени [09:04:00] удалена:

                    master_decision
2019-01-01 09:01:00               3
2019-01-01 09:02:00               2
2019-01-01 09:03:00               2
2019-01-01 09:04:00               3
2019-01-01 09:06:00               2

Требуемый результат: (строка с отметкой времени [09:04:00] и [09:05:00] удалена

2019-01-01 09:01:00               3
2019-01-01 09:02:00               2
2019-01-01 09:04:00               3
2019-01-01 09:06:00               2
1
Toolbox 20 Май 2019 в 10:22

2 ответа

Лучший ответ

Вы можете использовать coredata из zoo и сохранить значения, которые отличаются от предыдущего, путем поднабора данных.

library(zoo)
xts1[c(TRUE, coredata(xts1)[-length(xts1)] != coredata(xts1)[-1]), ]

#                    master_decision
#2019-01-01 09:01:00               3
#2019-01-01 09:02:00               2
#2019-01-01 09:04:00               3
#2019-01-01 09:06:00               2

Или чтобы сохранить его полностью в базе R, используйте as.numeric

xts1[c(TRUE, as.numeric(xts1)[-length(xts1)] != as.numeric(xts1)[-1]), ]

Другой вариант - использовать head / tail вместо -length(xts1) и -1 для подмножества

xts1[c(TRUE, tail(as.numeric(xts1), -1) != head(as.numeric(xts1), -1)), ]
3
Ronak Shah 20 Май 2019 в 07:40

Это делает работу также. Получите первые индексы последовательностей одинаковых значений, а затем отфильтруйте их.

idx <-cumsum(c(1,rle(master_decision)$lengths))
idx <- idx[-length(idx)]

xts1 <- xts(x = master_decision[idx], order.by = dates[idx])

2019-01-01 09:01:00    3
2019-01-01 09:02:00    2
2019-01-01 09:04:00    3
2019-01-01 09:06:00    2
4
otwtm 15 Янв 2020 в 07:34