xts-根据某些条件删除行

时间:2018-11-22 08:39:20

标签: r xts

我需要根据列[code]中的某些条件删除xts行。删除xts时间序列中的时间间隔就可以了。

问题:我该如何解决step1 / step3 / step4。


标准如下:

步骤1:[代码]中的值[3]:如果xts以[代码] [3]开头,则删除该行。

步骤2:[代码]中的值[0]:。删除整行。

第3步:[code]中的值[2]: a)仅保留启动xts的[2],应删除第一个[2]上方的所有行。 b)保持[2]上方有[3]。

步骤4:[代码]中的值[3]:仅保留上方有[2]的[3]。

第二步的解决方案:

查找并保留所有[2]和[3],从而删除所有[0]:

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

我的R文件:

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 :(得分:1)

如果只有0、2和3作为值,则可以使用diff一次性获得大多数规则。只需要那些差异为1(大于3的2)或-1(大于2的3)的记录。因此diff的绝对值将是我们需要的。并且我们需要第一行的值为2。将这些行组合起来即可得到结果xts3_filtered。     xts3_filtered <-c(xts3 [first(which(xts3 $ code == 2))],xts3 [abs(diff(xts3 $ code))== 1])

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

现在我们有了重复的行,因为这两个规则都选择前两个出现的记录。因此,我们使用以下代码删除所有重复项

xts3_filtered[!duplicated(index(xts3_filtered))]
                   code
2013-07-24 09:02:00    2
2013-07-24 09:07:00    3