R:如何过滤/子集日期序列

Posted

技术标签:

【中文标题】R:如何过滤/子集日期序列【英文标题】:R: How to filter/subset a sequence of dates 【发布时间】:2015-04-04 19:42:34 【问题描述】:

我有这些数据:(12 月完成)

      date     sessions
1   2014-12-01  1932
2   2014-12-02  1828
3   2014-12-03  2349
4   2014-12-04  8192
5   2014-12-05  3188
6   2014-12-06  3277

并且需要对其进行子集化/过滤,例如从“2014-12-05”到“2014-12-25”

我知道您可以使用运算符“:”创建序列。

示例:b

但是如何过滤一个序列?我试过这个

NewDate <- filter(Dates, date("2014-12-05":"2014-12-12"))

但是说:

错误:出现意外符号:“NewDate

【问题讨论】:

这能回答你的问题吗? Subset a dataframe between 2 dates 【参考方案1】:

你可以使用subset

生成您的样本数据:

temp<-
read.table(text="date     sessions
2014-12-01  1932
2014-12-02  1828
2014-12-03  2349
2014-12-04  8192
2014-12-05  3188
2014-12-06  3277", header=T)

确保它是日期格式:

temp$date <- as.Date(temp$date, format= "%Y-%m-%d")

temp



 #        date sessions
 # 1 2014-12-01     1932
 # 2 2014-12-02     1828
 # 3 2014-12-03     2349
 # 4 2014-12-04     8192
 # 5 2014-12-05     3188
 # 6 2014-12-06     3277

使用subset

subset(temp, date> "2014-12-03" & date < "2014-12-05")

给出:

  #        date sessions
  # 4 2014-12-04     8192

你也可以使用[]:

temp[(temp$date> "2014-12-03" & temp$date < "2014-12-05"),]

【讨论】:

这很简单,谢谢!我想我太累了,我只是让我的头脑变得比实际更难......【参考方案2】:

如果你想使用dplyr,你可以试试这样的。

mydf <- structure(list(date = structure(c(16405, 16406, 16407, 16408, 
16409, 16410), class = "Date"), sessions = c(1932L, 1828L, 2349L, 
8192L, 3188L, 3277L)), .Names = c("date", "sessions"), row.names = c("1", 
"2", "3", "4", "5", "6"), class = "data.frame")

# Create date object
mydf$date <- as.Date(mydf$date) 

filter(mydf, between(date, as.Date("2014-12-02"), as.Date("2014-12-05")))

#If you avoid using `between()`, the code is simpler.

filter(mydf, date >= "2014-12-02", date <= "2014-12-05")
filter(mydf, date >= "2014-12-02" & date <= "2014-12-05")

#        date sessions
#1 2014-12-02     1828
#2 2014-12-03     2349
#3 2014-12-04     8192
#4 2014-12-05     3188

【讨论】:

我认为逻辑条件是&amp;,但看起来, 有效。这对我来说是新事物。谢谢。 @akrun 看起来两者都很好,不是吗?我在来自 User 的 Hadley 的 dplyr 教程 pdf 中看到了这两个版本! 2014. 我将发布两个版本。我对between 的行为有点疑惑。我想知道为什么需要再次使用as.Date 同样的原因 seq.Date(as.Date(x1),as.Date(x2),by="years") 需要它 - 您需要处理 Date 对象以便数据匹配。 @thelatemail 这个例子让我明白了。非常感谢。 :) @akrun 一如既往的快乐。 data.table 中的 between 似乎节省了一些输入。【参考方案3】:

使用data.table的选项

 library(data.table)
 setDT(df)[date %between% c('2014-12-02', '2014-12-05')]
 #         date sessions
 #1: 2014-12-02     1828
 #2: 2014-12-03     2349
 #3: 2014-12-04     8192
 #4: 2014-12-05     3188

即使“日期”是“字符”列,这也应该有效

 df$date <- as.character(df$date)
 setDT(df)[date %between% c('2014-12-02', '2014-12-05')]
 #       date sessions
 #1: 2014-12-02     1828
 #2: 2014-12-03     2349
 #3: 2014-12-04     8192
 #4: 2014-12-05     3188

如果我们想要排除范围的子集

  setDT(df)[between(date, '2014-12-02', '2014-12-05', incbounds=FALSE)]
  #         date sessions
  #1:  2014-12-03     2349
  #2:  2014-12-04     8192

数据

 df <-  structure(list(date = structure(c(16405, 16406, 16407, 16408, 
 16409, 16410), class = "Date"), sessions = c(1932L, 1828L, 2349L, 
 8192L, 3188L, 3277L)), .Names = c("date", "sessions"), row.names = c("1", 
 "2", "3", "4", "5", "6"), class = "data.frame")

【讨论】:

我一直在寻找最快的日期过滤选项以在ggplot::geom_xxxx(data=DT[]) 中使用。快速研究表明这将是最快的选择:在性能方面使用 %between% 或 between() 是否重要?它在内部使用 as.Date() 吗?我在做什么:'ggplot(DT, aes(date, y_var)) + geom_step() + geom_step(data = DT[,DATE %in% ymd("2017-02-01"):ymd("2017- 10-31"),] , aes(date, yvar), col='black', size=1.6 )' 这只是为了突出当前(2017)年线:“黑色”和更大的尺寸。 @Dan 如果您使用来自data.tablebetween,即between(x, lower, upper, incbounds=TRUE)# x %between% y %between% 是否将日期字符转换为真实日期?使用 data.table 的 %between% 和使用 lubridate 的 %within% 有什么区别?【参考方案4】:

lubridate

mydates <- interval(start = "2014-12-05", end = "2014-12-25")
NewDate <- Dates[which(date %within% mydates),]

【讨论】:

你不需要which 不同意。 Which 索引符合条件的行并返回其中的一个子集。否则,子集索引是 TRUE/FALSE 的向量,但 NA 行既不是 T 也不是 F,因此将所有 NA 行返回到结果。 你是对的。有趣的。我认为子集只会返回 TRUE,而不是不返回 FALSE(因为 NA 也是合乎逻辑的)。我猜我使用dplyr 太多了。在filter 中使用它不会返回 NA。谢谢。

以上是关于R:如何过滤/子集日期序列的主要内容,如果未能解决你的问题,请参考以下文章

R:基于多个条件的两个数据帧的子集

R中按日期范围设置的子集data.table

R语言window函数提取时序数据数据子集(subset):使用xts包将dataframe数据转化为时间序列数据(time series)使用window函数从时间序列对象中提取数据子集

将时间序列数据子集到定义的间隔中

R语言中怎么提取时间序列数据框中符合行名称的子集

在 Python 中对选定的日期数据进行子集化