我的数据框有四个变量。
DF <- read.table(text=" v1 v2 v3 v4
175 14.842 3.06 3300.00
176 0.777 3.21 80
177 4.770 4.15 39.28
178 10.450 6.24 50.36
179 0.507 6.27 0.48
180 0.037 3.31 -47.21
181 15.627 6.28 89.73
182 57.856 16.90 169.11
183 26.457 20.10 70
184 1.482 20.29 0.95
185 0.842 20.45 0.79", header=TRUE)
在3的移动窗口中,即(175,176,177),(176,177,178),(177,178,179),(178,179,180)等等,在列v4中,如果所有三个v4都是&gt;,我想打印中间行。 -30。例如,如果175,176,177中的v4都是> -30,然后存储176,如果(176,177,178)中的v4都大于&gt; -30,然后存储177等等。
以下代码(由Roland提供)完成了这项工作。 https://stackoverflow.com/questions/24453810/test-criteria-for-a-moving-window-of-3-rows-in-a-data-frame/24454255#24454255
ind <- DF$v4 > -30
ind <- filter(ind, rep(1, 3)) == 3L
ind[is.na(ind)] <- FALSE
DF[ind, ]
# v1 v2 v3 v4
#2 176 0.777 3.21 80.00
#3 177 4.770 4.15 39.28
#8 182 57.856 16.90 169.11
但是我需要对代码稍作修改。除了所有三个v4之外> -30,第一个(三个)的v3值应大于2.5。例如,在(175,176,177)中,如果v4&gt; -30适用于所有人和v3&gt; 2.5为175,商店为176。对于(176,177,178),如果v4&gt; -30适用于所有三个和v3&lt; 2.5为176,然后不存储177.
再次感谢。
答案 0 :(得分:1)
试试这个:
library(zoo)
ok <- function(ix) with(DF[ix, ], all(v4 > -30) & v3[1] > 2.5)
DF[ rollapply(1:nrow(DF), 3, ok, fill = FALSE), ]
,并提供:
v1 v2 v3 v4
2 176 0.777 3.21 80.00
3 177 4.770 4.15 39.28
4 178 10.450 6.24 50.36
8 182 57.856 16.90 169.11
9 183 26.457 20.10 70.00
10 184 1.482 20.29 0.95
请注意,v3
在示例数据中始终大于2.5,因此条件在此处无效。