R: วิธีกรอง/ซับเซ็ตลำดับวันที่

ฉันมีข้อมูลนี้: (สมบูรณ์สำหรับเดือนธันวาคม)

      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 ถึง 25-12-2014

ฉันรู้ว่าคุณสามารถสร้างลำดับด้วยโอเปอเรเตอร์ :

ตัวอย่าง: ข ‹- ค(1:5)

แต่จะกรองลำดับได้อย่างไร? ฉันลองสิ่งนี้

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

แต่พูดว่า:

ข้อผิดพลาด: สัญลักษณ์ที่ไม่คาดคิดใน: NewDate ‹- filter(Dates, date(2014-12-05:2014-12-12) NewDate


person Omar Gonzales    schedule 05.02.2015    source แหล่งที่มา


คำตอบ (4)


คุณสามารถใช้ 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"),]
person jalapic    schedule 05.02.2015
comment
มันง่ายมาก ขอบคุณ! ฉันคิดว่าฉันเหนื่อยมาก ฉันแค่ทำให้สิ่งต่างๆ ในหัวหนักขึ้นกว่าที่เป็นอยู่จริงๆ... - person Omar Gonzales; 05.02.2015

หากคุณต้องการใช้ 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
person jazzurro    schedule 05.02.2015
comment
ฉันคิดว่าเงื่อนไขตรรกะจะเป็น & แต่ดูเหมือนว่า , จะได้ผล มันเป็นสิ่งใหม่สำหรับฉัน ขอบคุณ. - person akrun; 05.02.2015
comment
@akrun ดูเหมือนว่าทั้งคู่จะสบายดีที่นี่ใช่ไหม ฉันเห็นทั้งสองเวอร์ชันใน dplyr บทช่วยสอน pdf ของ Hadley จาก UseR! 2014 ฉันจะโพสต์ทั้งสองเวอร์ชัน ฉันสับสนเล็กน้อยกับพฤติกรรมของ between ฉันสงสัยว่าทำไมเราต้องใช้ as.Date อีกครั้ง - person jazzurro; 05.02.2015
comment
เหตุผลเดียวกันที่ seq.Date(as.Date(x1),as.Date(x2),by="years") ต้องการ - คุณต้องทำงานกับวัตถุ Date เพื่อให้ข้อมูลตรงกัน - person thelatemail; 05.02.2015
comment
@thelatemail ตัวอย่างนั้นทำให้ฉันกระจ่างขึ้น ขอบคุณมาก. :) - person jazzurro; 05.02.2015
comment
@akrun เพลินเช่นเคย ดูเหมือนว่า between ใน data.table จะบันทึกการพิมพ์บางส่วน - person jazzurro; 05.02.2015

ตัวเลือกที่ใช้ 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")
person akrun    schedule 05.02.2015
comment
ฉันกำลังมองหาตัวเลือกการกรองวันที่ที่เร็วที่สุดเพื่อใช้ภายใน 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): สีดำและขนาดที่ใหญ่กว่า - person Dan; 18.08.2017
comment
@Dan หากคุณใช้ between จาก data.table เช่น between(x, lower, upper, incbounds=TRUE)# x %between% y - person akrun; 18.08.2017
comment
%between% แปลงอักขระวันที่เป็นวันที่จริงหรือไม่ อะไรคือความแตกต่างระหว่างการใช้ % ระหว่าง% ของ data.table และการใช้ % ภายใน% ของ lubridate - person skan; 14.02.2021

ด้วย 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
คุณไม่จำเป็นต้อง which - person hmhensen; 14.12.2019
comment
ไม่เห็นด้วย. Which จัดทำดัชนีแถวที่ตรงกับเงื่อนไขและส่งกลับชุดย่อยของแถวเหล่านั้น มิฉะนั้น ดัชนีการตั้งค่าย่อยจะเป็นเวกเตอร์ของ TRUE/FALSE แต่แถว NA จะเป็นทั้ง T หรือ F ดังนั้นจึงส่งกลับแถว NA ทั้งหมดไปยังผลลัพธ์ - person dez93_2000; 14.12.2019
comment
คุณถูก. น่าสนใจ. ฉันคิดว่าการตั้งค่าย่อยจะส่งคืน TRUE เท่านั้นแทนที่จะไม่ส่งคืน FALSE (เนื่องจาก NA ก็เป็นตรรกะเช่นกัน) ฉันเดาว่าใช้ dplyr มากเกินไป การใช้ใน filter จะไม่ส่งคืน NA ขอบคุณ. - person hmhensen; 14.12.2019