如何在 R 中对时间进行子集化

How to subset times in R

在 R 我有数据

USER   BIRTH
11     "2013-01-11 22:31:11"
121    "2014-12-26 04:07:35"
...

我想创建一个新的数据集data_new,其中包含10点到11点之间的所有USERUSERBIRTH的类型是strings/characters。我试过这个:

data_new= data$BIRTH > as.POSIXct("10:00:00", format="%H:%M:%S")
& data$BIRTH < as.POSIXct("11:00:00", format="%H:%M:%S")

但是这里 R 对所有条目都给出 FALSE,所以这不起作用。 我该如何解决这个问题?

更新

假设我要查找所有时段的用户数。我使用答案并尝试这个

u=c()
for(j in 1:24)  {
data_new=data[times > "00:00:00"+(j-1) & times < "01:00:00"+j ,]
#saving the number of users in vector u
u[j]=dim(data_new)[1]
}

但 R 无法计算出术语 "00:00:00"+(j-1)

如果 df 是您的数据框:

df <- read.table(text = 'USER   BIRTH
11     "2013-01-11 22:31:11"
121    "2014-12-26 04:07:35"
121    "2014-12-26 10:07:35"
121    "2014-12-26 11:07:35"
121    "2014-12-26 10:38:35"', header = T)

df$BIRTH <- ymd_hms(df$BIRTH)

times <- strftime(df$BIRTH, format = "%H:%M:%S")
df[times > "10:00:00" & times < "11:00:00",]

输出:

  USER               BIRTH
3  121 2014-12-26 10:07:35
5  121 2014-12-26 10:38:35

对数据的每个子集执行操作的一种方法是使用 split-lapply 范例。在这种情况下,您会将 data$BIRTH 转换为 POSIXlt 并按 POSIXlt 对象的 hour 组件拆分。这将为您提供一个列表,其中每个列表元素都包含特定时间的所有数据。

data <- read.csv(text = "USER,BIRTH
11,2013-01-11 22:31:11
12,2014-12-26 04:07:35
21,2014-12-26 10:07:35
121,2014-12-26 11:07:35
112,2014-12-26 10:38:35")

data_by_hour <- split(data, as.POSIXlt(data$BIRTH)$hour)

然后你可以使用lapply(或sapply)对每个子集做任何你想做的事。计算每小时的观察次数:

# number of observations for each hour
sapply(data_by_hour, nrow)
 4 10 11 22 
 1  2  1  1

你也可以用 xts 做这个。

library(xts)
# Create xts object from 'data' data.frame
# Note: xts objects are based on a matrix, so you cannot have columns with
#       mixed types like you can with a data.frame.
x <- xts(data["USER"], as.POSIXct(data$BIRTH))
period.apply(x, endpoints(x, "hours"), nrow)
#                     USER
# 2013-01-11 22:31:11    1
# 2014-12-26 04:07:35    1
# 2014-12-26 10:38:35    2
# 2014-12-26 11:07:35    1

请注意,您可以使用 xts 进行时间子集设置。它避免了因在字符串上使用逻辑运算符而导致的潜在的与语言环境相关的整理顺序问题。

x["T10:00/T11:00"]
#                     USER
# 2014-12-26 10:07:35   21
# 2014-12-26 10:38:35  112