[英]select rows based on multiple criteria in moving window of 3
我的數據框有四個變量。
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均> -30,我想打印中間行。 例如,如果175,176,177中的v4全部> -30,則存儲176,如果(176,177,178)中的v4全部大於> -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> -30,而175的v3> 2.5,則存儲176。對於(176,177,178),如果所有三個變量的v4> -30,而176的v3 <2.5,則不存儲商店177。
再次感謝。
嘗試這個:
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,因此此處的條件無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.