Очистить столбец от дубликатов, находящихся в блоках - PullRequest
0 голосов
/ 23 ноября 2018

Вопрос: Как можно очистить данные от «дубликатов» внутри блоков.Я использую термин [блоки], чтобы проиллюстрировать, что 2 значения (в одном и том же столбце) равны и расположены выше или ниже.

В столбце [c1] у меня есть значения [2] и [3].

Значение [2] никогда не должно иметь значение [2] в.

Значение [3] никогда не должно иметь значение [3] в.

Я не могу использовать стандартное дублированиефункция удаления, потому что в столбце будут дубликаты.Невозможно удалить руководство по строкам, так как они будут в количестве тысяч.

Если возможно, было бы хорошо решить без загрузки пакетов R.

Мой R-файл:

##########
# Test xts
##########
dates <- as.POSIXct(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"
                      )
                    )
c1 <- c(2,3,2,2,3,3,2)              # Data in c1.
# c2 <- c(0,3,2,2,3,0,2)            # Data in c2.
data <- data.frame(c1)              # Create a dataframe.
xts9 <- xts(x=data, order.by=dates) # Create xts based on dataframe.

Результат запуска R-файла:

                    c1
2013-07-24 09:01:00  2
2013-07-24 09:02:00  3
2013-07-24 09:03:00  2
2013-07-24 09:04:00  2
2013-07-24 09:05:00  3
2013-07-24 09:06:00  3
2013-07-24 09:07:00  2

Комментарии, какие строки следует удалить:

                    c1
2013-07-24 09:01:00  2
2013-07-24 09:02:00  3
2013-07-24 09:03:00  2
2013-07-24 09:04:00  2 # To be remove due to having a 2 above.
2013-07-24 09:05:00  3
2013-07-24 09:06:00  3 # To be remove due to having a 2 above.
2013-07-24 09:07:00  2

1 Ответ

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

Мы можем использовать функцию rleid из data.table, а затем использовать duplicated для удаления повторяющихся строк.

library(data.table)
xts9[!duplicated(rleid(xts9)), ]

#                    c1
#2013-07-24 09:01:00  2
#2013-07-24 09:02:00  3
#2013-07-24 09:03:00  2
#2013-07-24 09:05:00  3
#2013-07-24 09:07:00  2

Если вы хотите сделать это в базе R, мы можемиспользуйте rle вместо того, чтобы использовать ту же логику

x <- rle(rowSums(xts9))
xts9[!duplicated(rep(seq_along(x$values), x$lengths)), ]

#                    c1
#2013-07-24 09:01:00  2
#2013-07-24 09:02:00  3
#2013-07-24 09:03:00  2
#2013-07-24 09:05:00  3
#2013-07-24 09:07:00  2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...