【发布时间】:2014-09-24 18:44:46
【问题描述】:
假设我有一个由以下命令生成的日期向量:
dts<-seq(as.Date("2014-09-10"),as.Date("2014-09-20"),by="Days")
我还有一个用户 ID 和日期的数据框(其中时间戳列属于 Date 类):
>df
respondent_id timestamp
12 2014-09-19
13 2014-09-11
12 2014-09-20
9 2014-09-16
13 2014-09-15
12 2014-09-18
9 2014-09-15
9 2014-09-16
12 2014-09-20
13 2014-09-14
我在这里的最终目标是在 dts 范围内统计所有在 24 小时内具有另一个时间戳的时间戳的用户。最后我会得到这样的东西:
>final
Date Count
2014-09-10 0
2014-09-11 0
2014-09-12 0
2014-09-13 0
2014-09-14 0
2014-09-15 1
2014-09-16 2
2014-09-17 0
2014-09-18 0
2014-09-19 1
2014-09-20 1
我最初的方法是遍历 dts 并使用 apply() 和 which() 的组合来选择数据:
for (i in 1:length(dts)){
day1 <- apply(as.data.frame(df$timestamp),1,function(x) which(x>=dts[i]-1 & x<=dts[i],arr.ind=TRUE))
}
tmp1 <- df[day1,]
tmp11 <- as.data.frame(table(tdf$timestamp))
names(tmp11) <- c("Date","Count")
tmp11$Date <- as.Date(tmp11$Date)
但这并不成功。变量 day1 是一个列表,因此不能用于子集数据框。使用命令unlist() 和as.data.frame() 会生成一个包含df 正确索引的数据框。我仍在过渡到使用 apply() 代替循环,因此非常感谢任何反馈。
【问题讨论】: