R: 如何 filter/subset 日期序列
R: How to filter/subset a sequence of dates
我有以下数据:(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
并且需要subset/filter这个,例如从“2014-12-05”到“2014-12-25”
我知道您可以使用运算符“:”创建序列。
示例:b <- c(1:5)
但是如何筛选一个序列呢?我试过这个
NewDate <- filter(Dates, date("2014-12-05":"2014-12-12"))
但是说:
Error: unexpected symbol in: "NewDate <- filter(Dates,
date("2014-12-05":"2014-12-12") NewDate"
你可以使用 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"),]
如果你想使用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
一个选项使用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")
和lubridate
,
mydates <- interval(start = "2014-12-05", end = "2014-12-25")
NewDate <- Dates[which(date %within% mydates),]
我有以下数据:(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
并且需要subset/filter这个,例如从“2014-12-05”到“2014-12-25”
我知道您可以使用运算符“:”创建序列。
示例:b <- c(1:5)
但是如何筛选一个序列呢?我试过这个
NewDate <- filter(Dates, date("2014-12-05":"2014-12-12"))
但是说:
Error: unexpected symbol in: "NewDate <- filter(Dates, date("2014-12-05":"2014-12-12") NewDate"
你可以使用 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"),]
如果你想使用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
一个选项使用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")
和lubridate
,
mydates <- interval(start = "2014-12-05", end = "2014-12-25")
NewDate <- Dates[which(date %within% mydates),]