2013-03-01 49 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