【问题标题】:dplyr does not group data by datedplyr 不按日期对数据进行分组
【发布时间】:2026-01-27 22:35:01
【问题描述】:

我正在尝试使用 Leada 提供的数据集计算人们骑自行车的频率。

代码如下:

library(dplyr)

setAs("character", "POSIXlt", function(from) strptime(from, format = "%m/%d/%y %H:%M"))
d <- read.csv("http://mandrillapp.com/track/click/30315607/s3-us-west-1.amazonaws.com?p=eyJzIjoiemxlVjNUREczQ2l5UFVPeEFCalNUdmlDYTgwIiwidiI6MSwicCI6IntcInVcIjozMDMxNTYwNyxcInZcIjoxLFwidXJsXCI6XCJodHRwczpcXFwvXFxcL3MzLXVzLXdlc3QtMS5hbWF6b25hd3MuY29tXFxcL2RhdGF5ZWFyXFxcL2Jpa2VfdHJpcF9kYXRhLmNzdlwiLFwiaWRcIjpcImEyODNiNjMzOWJkOTQxMGM5ZjlkYzE0MmQ0NDQ5YmU4XCIsXCJ1cmxfaWRzXCI6W1wiMTVlYzMzNWM1NDRlMTM1ZDI0YjAwODE4ZjI5YTdkMmFkZjU2NWQ2MVwiXX0ifQ",
              colClasses = c("numeric", "numeric", "POSIXlt", "factor", "numeric", "POSIXlt", "factor", "numeric", "numeric", "factor", "character"),
              stringsAsFactors = T)
names(d)[9] <- "BikeNo"

d <- tbl_df(d)

d <- d %>% mutate(Weekday = factor(weekdays(Start.Date)))
d %>% group_by(Weekday) 
  %>% summarise(Total = n()) 
  %>% select(Weekday, Total)

这很奇怪,但 dplyr 不想按 Weekday 对数据进行分组:

错误:列“Start.Date”的类型不受支持

为什么它关心我按因素分组的 Start.Date 列? 您可以在本地运行代码来重现错误:它会自动下载数据。

附:我正在使用 dplyr 版本:dplyr_0.3.0.2

【问题讨论】:

  • 您的问题可能与dplyr 不支持POSIXlt 类的变量有关。参见例如herehere。你可以改用POSIXct 吗?
  • 是的,我可以。你是对的,如果我将 Start.Date 和 End.Date 转换为 POSIXct dplyr 工作正常!哇,这对我来说是一种奇怪的行为。您知道强制 strptime 创建 POSIXct 而不是 POSIXlt 的方法吗?我不想在读取文件后有 2 个单独的行来转换数据。
  • 使用as.POSIXct 而不是strptime。另一方面,也许您也可以将它们保留为character。至少在我看来,您显示的代码并不真正取决于POSIX
  • 请先阅读?as.POSIXct,尤其是format参数。
  • @Sergei,我想你现在已经足够回答你自己的问题了......

标签: r dplyr strptime


【解决方案1】:

lubridate 包在处理日期时很有用。 下面是解析 Start.Date 和 End.Date 的代码,提取工作日,然后按工作日分组:

将日期读取为字符向量

library(dplyr)
library(lubridate)
# For some reason your instruction to load the csv directly from a url
# didn't work. I save the csv to a temporary directory.
d <- read.csv("/tmp/bike_trip_data.csv", colClasses = c("numeric", "numeric", "character", "factor", "numeric", "character", "factor", "numeric", "numeric", "factor", "character"), stringsAsFactors = T)

names(d)[9] <- "BikeNo"
d <- tbl_df(d)

使用 lubridate 转换开始日期和结束日期

d <- d %>% 
  mutate(
    Start.Date = parse_date_time(Start.Date,"%m/%d/%y %H:%M"),
    End.Date = parse_date_time(End.Date,"%m/%d/%y %H:%M"),
    Weekday = wday(Start.Date, label=TRUE, abbr=FALSE))

每周一天的行数

d %>%
  group_by(Weekday) %>%
  summarise(Total = n())

#     Weekday Total
# 1    Sunday 10587
# 2    Monday 23138
# 3   Tuesday 24678
# 4 Wednesday 23651
# 5  Thursday 25265
# 6    Friday 24283
# 7  Saturday 12413

【讨论】:

    【解决方案2】:

    很抱歉,如果这个问题早已被遗忘,但当我一直使用更简单的解决方案(使用 @ 从 plyr 包调用排列函数)时,看到每个人都建议转换为 POSIX.ct 或字符,这让我感到很奇怪987654321@,因为 POSIXlt 格式似乎没有问题。由于我通常不是为 R 中的问题找到最简单解决方案的人,因此我开始认为它有问题。它与 dplyr 版本不一样吗?

    【讨论】:

    • 这是一个答案还是提出一个新问题?
    最近更新 更多