2014-11-21 7 views
7

Verilerimin ardışık günler için eşiğe nerede ulaştığını bulmam gerekiyor. Eşiğin üstünde 4 ardışık gözlem arıyorum. Bu kriterleri karşılayan serilerin ilk gözleminin yerini döndürmek istiyorum. Eşiğin üstündeki ardışık değerler için konum ve değer

eg = structure(list(t.date = structure(c(1L, 2L, 11L, 12L, 13L, 14L, 
15L, 16L, 17L, 18L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), .Label = c("4/30/11", 
"5/1/11", "5/10/11", "5/11/11", "5/12/11", "5/13/11", "5/14/11", 
"5/15/11", "5/16/11", "5/17/11", "5/2/11", "5/3/11", "5/4/11", 
"5/5/11", "5/6/11", "5/7/11", "5/8/11", "5/9/11"), class = "factor"), 
t.avg = c(4L, 4L, 5L, 6L, 10L, 18L, 18L, 18L, 18L, 12L, 10L, 
10L, 8L, 8L, 9L, 10L, 6L, 5L)), .Names = c("date", "avg" 
), row.names = c(NA, -18L), class = "data.frame") 

Ben ort (4 gün boyunca ort> 17) kriterlerini karşılayan tarihi Bir yaklaşım istiyorum: Burada

bir örnek veri kümesi bu durumda

eg$date %in% eg$date[which(eg$avg > 17)] 
# [1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE 
# [13] FALSE FALSE FALSE FALSE FALSE FALSE 

Ben TRUE'un ilk örneğini yanıt olarak alabilir, ancak ikinci, üçüncü veya dördüncü ise TRUE

eg$date[which(eg$avg > 17)] 
# [1] 5/5/11 5/6/11 5/7/11 5/8/11 

Ve serinin ilk gözlem yeri: Ben soru ile ilgili ama eğmek edemedik bulduk

which(eg$avg > 17) 
# [1] 6 7 8 9 

koşul TRUE olduğu 10 İlk tarihine gerek ihtiyaçlarımın yöntemleri.

Çok teşekkürler. Ayrıca

cevap

2
library(zoo) 
# Get the index value 
xx <- which(rollapply(eg$avg,4, function(x) min(x))>17)[1] 
# Get the date 
eg$date[xx] 
+1

gerektiğini Böyle bir işlev varsa, 'rollmin' olun. ya da belki de rollapply (..., min, 4) –

+0

İyi yakalama! Alan adı "avg" ile kafam karıştı ve sadece onunla devam etti. Yorumunuzu yansıtacak şekilde düzenledim. – Jordan

+1

'rollmax' şu şekilde var: 'hangi (-rollmax (-eg $ avg, 4)> 17) [1]' –

1

Kullanım çalışma uzunluğu kodlama (rle)

> rle(eg$avg > 17) 
Run Length Encoding 
    lengths: int [1:3] 5 4 9 
    values : logi [1:3] FALSE TRUE FALSE 

rleg <- rle(eg$avg > 17) 
rleg$lengths[!rleg$values][1] # returns so add one to it 
#Only works in this case b/c no test for length of run Gt 17 
# if first 4 all gt 17 then return 1 
# else return 1+ cumsum of lengths up to first true with length Gt or equal to 4 

# The code to do that. 

if (rleg$values[1] && rleg$lengths[1] >=4) {1} else{ 
    1+ cumsum(rleg$lengths[1:which(rleg$lengths >=4 & 
            rleg$values)][1])} 
#[1] 6 
+0

İşleri de teşekkürler. – frostygoat

0

Yapılabilir kullanarak baz R:

eg$th = ifelse(eg$avg>17, 1,0) 
for(i in 4:nrow(eg)) {if(sum(eg$th[(i-3):i])>3) print(i-3)} 
[1] 6 

gerçek tarih için:

for(i in 4:nrow(eg)) {if(sum(eg$th[(i-3):i])>3) print(eg[i-3,1])} 
[1] 5/5/11 
İlgili konular