3

我有一个df包含“消息”的数据框。每一行都是一条消息。每条消息都有一个df$messagedate以 POSIXct 格式调用的时间戳%Y-%m-%d %H:%M:%S。例子:

> head(df)
messageid   user.id    message.date         
123         999       2011-07-17 17:54:27
456         888       2011-07-19 16:56:50

(这是dput()上面的 'ed 版本):

df <- structure(list(messageid = c(123L, 456L), user.id = c(999L, 888L), 
      message.date = structure(c(1310950467, 1311119810), class = c("POSIXct", 
      "POSIXt"), tzone = "")), .Names = c("messageid", "user.id", 
      "message.date"), row.names = c(NA, -2L), class = "data.frame")

如何创建包含每天消息总数的数据框?例子:

day                   message.count 
2011-07-17             1
2011-07-18             0
2011-07-19             1

而不是不包括没有消息的日期,我想确保message.count那些日子的设置为零。

到目前为止我所做的:我通过以下方式提取了日历日部分message.date

df$calendar.day<-as.POSIXct(strptime(substr(df$message.date,1,10),"%Y-%m-%d",tz="CST6CDT"))
> head(df$calendar.day)
[1] "2011-07-17 CDT" "2011-07-18 CDT" "2011-07-19 CDT"

从那里我可以生成日期范围内每个日历日期的列表: daterange <- seq(min(df$calendar.day), max(df$calendar.day), by="day")

4

2 回答 2

2

这是一个相当简单的解决方案,用于sapply()计算日志跨越的每个日期的消息数。

countMessages <- function(timeStamps) {
    Dates <- as.Date(strftime(df$message.date, "%Y-%m-%d"))
    allDates <- seq(from = min(Dates), to = max(Dates), by = "day")
    message.count <- sapply(allDates, FUN = function(X) sum(Dates == X))
    data.frame(day = allDates, message.count = message.count)
}

countMessages(df$message.date)
#          day message.count
# 1 2011-07-17             1
# 2 2011-07-18             0
# 3 2011-07-19             1
于 2012-04-17T16:58:31.510 回答
1

您应该能够在 table() 函数上使用 as.data.frame 将表格结果强制转换为数据框。例如:

test_data <- data.frame(date=c("March","April","April","May"),messageid=c(1,2,3,4),userid=c(55,33,1,56))
print(as.data.frame(table(test_data[1])))

结果是:

   Var1 Freq
1 April    2
2 March    1
3   May    1

要添加具有零消息的日期,令我震惊的是,您可以生成适用于您的项目的所有日期的向量(例如,如果文件涵盖一整年),然后将该向量与数据框进行比较使用 table 语句创建。您只需将它们合并在一起,然后将 0 分配给那些 NA。

例如:

months <- c("January","February","March","April","May","June")
full <- merge(counts,months,by=1,all=TRUE)

显然,在这种情况下,数据框的顺序会很奇怪,但是如果您创建一个 POSIX 向量,这应该不是问题。

于 2012-04-17T15:02:23.860 回答