在R中我有数据
USER BIRTH
11 "2013-01-11 22:31:11"
121 "2014-12-26 04:07:35"
...
我想创建一个新数据集data_new
,其中包含10点钟到11点钟时间内的所有USER
。
USER
和BIRTH
的类型是字符串/字符。我试过这个:
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)
。
答案 0 :(得分:2)
如果var emitHand = JSON.parse(JSON.stringify(hand));
是您的数据框:
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",]
答案 1 :(得分:2)
对每个数据子集执行某项操作的一种方法是使用split
- lapply
范例。在这种情况下,您可以将data$BIRTH
转换为POSIXlt
,并按hour
对象的POSIXlt
组件进行拆分。这将为您提供一个列表,其中每个列表元素包含特定小时的所有数据。
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