我有以下数据,我想仅在连续几天应用函数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
答案 0 :(得分:5)
您可以在base R
中执行这些操作,而无需安装任何外部软件包。
假设“日期”列属于Date
类,我们采用“日期”的diff
,并根据相邻元素之间的差异是否大于1,我们可以通过获取逻辑向量的累积和(cumsum
)来创建分组索引('indx')。
indx <- cumsum(c(TRUE,abs(diff(df1$Date))>1))
在第二步中,我们可以将ave
与'indx'一起用作分组向量,并取{c}的diff
。 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
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)
尝试使用库lubridate
和dplyr
如果你没有让他们这样做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))