首页 > 解决方案 > xts - 根据某些条件删除行

问题描述

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

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


标准如下:

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

步骤 2:[code] 中的值 [0]:删除整个行。

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

第 4 步:[code] 中的值 [3]:仅保留在其上方有 [2] 的 [3]。

我对第 2 步的解决方案:

查找并保留所有 [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

标签: rxts

解决方案


如果您只有 0、2 和 3 作为值,您可以使用diff1 次获得大部分规则。只有差值为 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])

                    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

推荐阅读