仅在连续几天应用diff()

时间:2015-08-03 13:36:54

标签: r date diff

我有以下数据,我想仅在连续几天应用函数diff()diff(data$ch, differences = 1, lag = 1)返回ch的所有连续值之间的差异(23-12,4 -23,78-4,120-78,94-120,......)。我希望diff()函数在日期不连续时返回NA。我试图从以下数据中获得的输出是:

11, -19, 74, NA, -26, NA, -34, 39, NA

有谁知道我该怎么做?

Date        ch
2013-01-01  12
2013-01-02  23
2013-01-03  4
2013-01-04  78
2013-01-10  120
2013-01-11  94
2013-02-26  36
2013-02-27  2
2013-02-28  41
2003-03-05  22

3 个答案:

答案 0 :(得分:5)

您可以在base R中执行这些操作,而无需安装任何外部软件包。

假设“日期”列属于Date类,我们采用“日期”的diff,并根据相邻元素之间的差异是否大于1,我们可以通过获取逻辑向量的累积和(cumsum)来创建分组索引('indx')。

 indx <- cumsum(c(TRUE,abs(diff(df1$Date))>1))

在第二步中,我们可以将ave与'indx'一起用作分组向量,并取{c}的diffdiff的输出长度将比'ch'列的长度小1。因此,我们可以附加NA以使长度相同。

 ave(df1$ch, indx, FUN=function(x) c(diff(x),NA))
 #[1]  11 -19  74  NA -26  NA -34  39  NA  NA

数据

df1 <- structure(list(Date = structure(c(15706, 15707, 15708, 15709, 
15715, 15716, 15762, 15763, 15764, 12116), class = "Date"), ch = c(12L, 
23L, 4L, 78L, 120L, 94L, 36L, 2L, 41L, 22L)), .Names = c("Date", 
"ch"), row.names = c(NA, -10L), class = "data.frame")

答案 1 :(得分:5)

以下只是“......当日期不连续时返回NA”,除非有一些棘手的案例,它不会解释:

replace(diff(df1$ch), abs(diff(df1$Date)) > 1, NA)
#[1]  11 -19  74  NA -26  NA -34  39  NA

答案 2 :(得分:2)

尝试使用库lubridatedplyr

如果你没有让他们这样做install.packages("dplyr");install.packages("lubridate")

<强> 代码

library(lubridate)
library(dplyr)

data$Date <- ymd(data$Date)
data2 <- data %>% mutate(diff=ifelse(Date==lag(Date)+days(1), ch-lag(ch), NA))

<强> 数据

data <- 
  data.frame(Date=c("2013-01-01", "2013-01-02", "2013-01-03", "2013-01-04", "2013-01-10", 
                    "2013-01-11", "2013-01-26", "2013-01-27", "2013-01-28", "2013-03-05"),
               ch=c(12, 23, 4, 78, 120, 94, 36, 2, 41, 22))