R: Cara memfilter/mengelompokan urutan tanggal

Saya punya data ini: (lengkap untuk bulan Desember)

      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

Dan kebutuhan untuk mengelompokkan/memfilternya, misalnya dari 05-12-2014 hingga 25-12-2014

Saya tahu Anda dapat membuat urutan dengan operator :.

Contoh: b ‹- c(1:5)

Tapi Bagaimana cara memfilter suatu urutan? Saya mencoba ini

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

Tapi mengatakan:

Kesalahan: simbol tak terduga di: Tanggal Baru ‹- filter(Tanggal, tanggal(05-12-2014:12-12-2014) Tanggal Baru


person Omar Gonzales    schedule 05.02.2015    source sumber


Jawaban (4)


kamu bisa menggunakan subset

Menghasilkan data sampel Anda:

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)

Memastikannya dalam format tanggal:

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

Menggunakan subset :

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

yang memberikan:

  #        date sessions
  # 4 2014-12-04     8192

Anda juga bisa menggunakan []:

temp[(temp$date> "2014-12-03" & temp$date < "2014-12-05"),]
person jalapic    schedule 05.02.2015
comment
Ini sangat sederhana, terima kasih! Aku pikir aku sangat lelah, aku hanya membuat segalanya menjadi lebih sulit di kepalaku daripada yang sebenarnya... - person Omar Gonzales; 05.02.2015

Jika Anda ingin menggunakan dplyr, Anda dapat mencoba sesuatu seperti ini.

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
person jazzurro    schedule 05.02.2015
comment
Saya pikir kondisi logisnya adalah &, tetapi sepertinya , berfungsi. Itu adalah sesuatu yang baru bagi saya. Terima kasih. - person akrun; 05.02.2015
comment
@akrun Sepertinya keduanya baik-baik saja di sini, bukan? Saya melihat kedua versi di pdf tutorial dplyr Hadley dari User! 2014. Saya akan memposting kedua versi tersebut. Saya agak bingung dengan perilaku between. Saya bertanya-tanya mengapa seseorang perlu menggunakan as.Date lagi. - person jazzurro; 05.02.2015
comment
Alasan yang sama seq.Date(as.Date(x1),as.Date(x2),by="years") memerlukannya - Anda perlu mengerjakan objek Date agar datanya cocok. - person thelatemail; 05.02.2015
comment
@thelatemail Contoh itu menjernihkan pikiran saya. Terima kasih banyak. :) - person jazzurro; 05.02.2015
comment
@akrun Senang seperti biasa. Tampaknya between di data.table menghemat beberapa pengetikan. - person jazzurro; 05.02.2015

Opsi menggunakan 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

Ini akan berfungsi meskipun tanggalnya adalah kolom karakter

 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

Seandainya kita ingin membuat subset eksklusif dari rentang tersebut

  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")
person akrun    schedule 05.02.2015
comment
Saya telah mencari opsi pemfilteran tanggal tercepat untuk digunakan di dalam ggplot::geom_xxxx(data=DT[]). Penelitian cepat menunjukkan bahwa ini akan menjadi opsi tercepat: apakah penting dalam hal kinerja menggunakan %between% atau between()? Apakah menggunakan as.Date() di internal? Apa yang saya lakukan: '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 )' Ini hanya untuk menyorot garis tahun saat ini (2017): hitam dan ukurannya lebih besar. - person Dan; 18.08.2017
comment
@Dan Jika Anda menggunakan between dari data.table yaitu between(x, lower, upper, incbounds=TRUE)# x %between% y - person akrun; 18.08.2017
comment
Apakah %between% mengubah karakter tanggal menjadi tanggal sebenarnya? Apa perbedaan antara menggunakan %between% data.table dan menggunakan %dalam% lubridate? - person skan; 14.02.2021

Dengan lubridate,

mydates <- interval(start = "2014-12-05", end = "2014-12-25")
NewDate <- Dates[which(date %within% mydates),]
person dez93_2000    schedule 13.12.2019
comment
Anda tidak perlu which. - person hmhensen; 14.12.2019
comment
Tidak setuju. Which mengindeks baris yang sesuai dengan kondisi dan mengembalikan sebagian baris tersebut. Jika tidak, indeks subsetting adalah vektor TRUE/FALSE, tetapi baris NA bukan T atau F dan dengan demikian mengembalikan semua baris NA ke hasilnya. - person dez93_2000; 14.12.2019
comment
Kamu benar. Menarik. Saya pikir subsetting hanya akan mengembalikan TRUE dan tidak mengembalikan FALSE (karena NA juga logis). Sepertinya saya terlalu banyak menggunakan dplyr. Menggunakannya di filter tidak mengembalikan NA. Terima kasih. - person hmhensen; 14.12.2019