xts - 根据特定条件删除行
xts - Delete rows based on certain criterias
我需要根据列 [代码] 中的特定条件删除 xts 行。删除xts时序会有时间差就好了。
问题:如何解决step1/step3/step4.
评判标准如下:
第 1 步:[code] 中的值 [3]: 如果 xts 以 [code] [3] 开头,则删除该行。
步骤 2:[代码] 中的值 [0]: 删除完整行。
第 3 步:[code] 中的值 [2]: a) 仅保留启动 xts 的 [2],第一个 [2] 之上的所有行都应该是删除。
b) 保持 [2] 在其上方有一个 [3]。
第 4 步:[code] 中的值 [3]: 仅保留 [3] 其自身上方有 [2]。
我对步骤 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
如果您只有 0、2 和 3 作为值,您可以使用 diff
一次性获得大部分规则。只需要差异为 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
现在我们有一个重复的行,因为两个规则 select 前 2 个出现的记录。因此,我们使用以下代码删除所有重复项
xts3_filtered[!duplicated(index(xts3_filtered))]
code
2013-07-24 09:02:00 2
2013-07-24 09:07:00 3
我需要根据列 [代码] 中的特定条件删除 xts 行。删除xts时序会有时间差就好了。
问题:如何解决step1/step3/step4.
评判标准如下:
第 1 步:[code] 中的值 [3]: 如果 xts 以 [code] [3] 开头,则删除该行。
步骤 2:[代码] 中的值 [0]: 删除完整行。
第 3 步:[code] 中的值 [2]: a) 仅保留启动 xts 的 [2],第一个 [2] 之上的所有行都应该是删除。 b) 保持 [2] 在其上方有一个 [3]。
第 4 步:[code] 中的值 [3]: 仅保留 [3] 其自身上方有 [2]。
我对步骤 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
如果您只有 0、2 和 3 作为值,您可以使用 diff
一次性获得大部分规则。只需要差异为 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
现在我们有一个重复的行,因为两个规则 select 前 2 个出现的记录。因此,我们使用以下代码删除所有重复项
xts3_filtered[!duplicated(index(xts3_filtered))]
code
2013-07-24 09:02:00 2
2013-07-24 09:07:00 3