【问题标题】:Using R to calculate total events per day from a data frame that contains all events and their timestamps使用 R 从包含所有事件及其时间戳的数据框中计算每天的总事件
【发布时间】:2012-04-17 14:24:06
【问题描述】:

我有一个包含“消息”的数据框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"

从那里我可以生成日期范围内每个日历日期的列表: 日期范围

【问题讨论】:

  • 如果你使用dput(df)(或者可能是 dput(df[1:5, ]),你会得到一个可以帮助我们尝试的可重现版本

标签: r


【解决方案1】:

这是一个相当简单的解决方案,它使用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

【讨论】:

  • 谢谢。这很棒。非常简洁。但是有一个问题,输入参数不应该是数据框(df)而不是列(timeStamps)吗?
【解决方案2】:

您应该能够在 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 向量,这应该不是问题。

【讨论】:

  • 哎呀,我看到我没有完全解决你的问题。我有一个想法 - 现在编辑答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2021-11-06
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多