仅在连续几天应用diff()

ste*_*tem 5 diff r date

我有以下数据,我想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
Run Code Online (Sandbox Code Playgroud)

有谁知道我怎么能这样做?

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
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

base R无需安装任何外部软件包即可完成这些操作.

假设'Date'列是Dateclass,我们取diff'Date'并根据相邻元素之间的差异是否大于1,我们可以通过累积来创建分组索引('indx')cumsum逻辑向量的sum().

 indx <- cumsum(c(TRUE,abs(diff(df1$Date))>1))
Run Code Online (Sandbox Code Playgroud)

在第二步中,我们可以使用ave'indx'作为分组向量,并使用diff'ch'.输出diff的长度将比'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
Run Code Online (Sandbox Code Playgroud)

数据

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")
Run Code Online (Sandbox Code Playgroud)


ale*_*laz 5

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

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