R: How to filter/subset a sequence of dates

后端 未结 4 1241
无人及你
无人及你 2020-12-03 07:52

I have this data: (complete for December)

      date     sessions
1   2014-12-01  1932
2   2014-12-02  1828
3   2014-12-03  2349
4   2014-12-04  8192
5   2014         


        
相关标签:
4条回答
  • 2020-12-03 07:53

    An option using 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
    

    This should work even if the "date" is "character" column

     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
    

    In case if we wanted to subset exclusive of the range

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

    data

     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")
    
    0 讨论(0)
  • 2020-12-03 07:59

    you could use subset

    Generating your sample data:

    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)
    

    Making sure it's in date format:

    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
    

    Using subset :

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

    which gives:

      #        date sessions
      # 4 2014-12-04     8192
    

    you could also use []:

    temp[(temp$date> "2014-12-03" & temp$date < "2014-12-05"),]
    
    0 讨论(0)
  • 2020-12-03 08:01

    If you want to use dplyr, you can try something like this.

    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
    
    0 讨论(0)
  • 2020-12-03 08:05

    With lubridate,

    mydates <- interval(start = "2014-12-05", end = "2014-12-25")
    NewDate <- Dates[which(date %within% mydates),]
    
    0 讨论(0)
提交回复
热议问题