2013-03-01 56 views
1

我有一個例子數據框:子集數據幀由連續3天與相關價值

 Date  p 
4 2001-01-04 6.9 
5 2001-01-05 4.5 
6 2001-01-06 5.9 
8 2001-01-08 15.8 
24 2001-01-24 1.3 
25 2001-01-25 4.6 
26 2001-01-26 13.0 
27 2001-01-27 45.1 
32 2001-02-01 5.0 
36 2001-02-05 21.9 
37 2001-02-06 25.4 
40 2001-02-09 1.4 
41 2001-02-10 1.9 
44 2001-02-13 9.1 
45 2001-02-14 23.0 
46 2001-02-15 8.8 
53 2001-02-22 1.1 
59 2001-02-28 24.8 

我想子集數據幀時,有連續3天與他們相關的p值,如日期:(2001-01-04,2001-01-05,2001-01-06)與他們的P值(6.9,4.5,5.9)。我有很大的數據框,我在這裏寫了一部分,我只需要連續3天被選中。

任何有關上述問題的幫助將不勝感激。

+0

使您的子集的條件很不清楚。你的例子中的p值如何與子集相關?我猜你的意思是「連續」而不是「繼續」。 – N8TRO 2013-03-01 02:04:40

+2

你對英語的使用似乎是一個問題。你能描述一下,當有三個日期順序時,你想要發生什麼,這個單詞是連續的或連續的,而不是「繼續」。你想要該序列的最後三個日期還是所有序列的運行日期大於或等於3個日期? – 2013-03-01 02:04:46

+0

我認爲OP正試圖提取連續三天的行的子集,並在提取的子集中包含p值。也許還可以將這些行的分組表示爲在同一個三天的塊中? – 2013-03-01 02:56:00

回答

1

此構建一個diff()矢量和檢出長度> = 2。它然後移​​回矢量之一,並做邏輯OR,因爲在一個運行中的第一項將有FALSE值的運行rle()$ value == 1

dat$Date <- as.Date(dat$Date) 
dat$diff <- c(0, diff(dat$Date)) 
datrl <- rle(dat$diff) # Inadvertently omitted this line in initial posting 
grp <- rep(seq_along(datrl$lengths), datrl$lengths)* 
     rep(datrl$values==1, datrl$lengths)* 
     rep(datrl$lengths>=2, datrl$lengths) 
dat[ grp | c(grp[-1], 0) , ] 

#---- 
> dat[ grp | c(grp[-1], 0) , ][1:3.] 
     Date p diff 
1 2001-01-04 6.9 0 
2 2001-01-05 4.5 1 
3 2001-01-06 5.9 1 
5 2001-01-24 1.3 16 
6 2001-01-25 4.6 1 
7 2001-01-26 13.0 1 
8 2001-01-27 45.1 1 
14 2001-02-13 9.1 3 
15 2001-02-14 23.0 1 
16 2001-02-15 8.8 1 
+0

我想你忘了放一步我無法理解什麼是「datrl」。你能寫出你如何定義「datrl」嗎? – user1954153 2013-03-02 05:57:45

+0

你說得很對。固定。 – 2013-03-02 16:45:51

1

假設您想要連續3個日期子集的列表。

data <- read.table(textConnection("Date  p\n2001-01-04 6.9\n2001-01-05 4.5\n2001-01-06 5.9\n2001-01-08 15.8\n2001-01-24 1.3\n2001-01-25 4.6\n2001-01-26 13.0\n2001-01-27 45.1\n2001-02-01 5.0\n2001-02-05 21.9\n2001-02-06 25.4\n2001-02-09 1.4\n2001-02-10 1.9\n2001-02-13 9.1\n2001-02-14 23.0\n2001-02-15 8.8\n2001-02-22 1.1\n2001-02-28 24.8"), 
    header = TRUE, colClasses = c("Date", "numeric")) 

# find out which dates are 3rd consecutive dates. sel below is logical vector indicating such dates 
sel <- c(0, diff(data$Date)) == 1 & c(0, 0, diff(data$Date, 2) == 2) 

# get start and end dates 
start <- which(sel) - 2 
end <- which(sel) 

# get all the 3 consecutive dates subsets 
mapply(function(start, end) data[start:end, ], start, end, SIMPLIFY = FALSE) 
## [[1]] 
##   Date p 
## 1 2001-01-04 6.9 
## 2 2001-01-05 4.5 
## 3 2001-01-06 5.9 
## 
## [[2]] 
##   Date p 
## 5 2001-01-24 1.3 
## 6 2001-01-25 4.6 
## 7 2001-01-26 13.0 
## 
## [[3]] 
##   Date p 
## 6 2001-01-25 4.6 
## 7 2001-01-26 13.0 
## 8 2001-01-27 45.1 
## 
## [[4]] 
##   Date p 
## 14 2001-02-13 9.1 
## 15 2001-02-14 23.0 
## 16 2001-02-15 8.8 
## 
+0

這會重複發生超過三次運行的值。 – 2013-03-01 03:41:06

+0

@DWin true。這只是我OP部分想要的。你的解決方案也不錯 – 2013-03-01 03:46:50