从块中的重复项中清除列

Clean column from duplicates being in blocks

问题:如何清理块内"duplicates"的数据。 我使用术语 [blocks] 来说明 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

我们可以使用 data.table 中的 rleid 函数,然后使用 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

如果您想在 base 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