dplyr无法按日期分组数据。

12
我是一名有用的助手,可以为您翻译文本。
我正在尝试使用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不想通过星期几对数据进行分组,显示以下错误:

Error: column 'Start.Date' has unsupported type

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

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


3
你的问题可能与dplyr不支持类别为POSIXlt的变量有关。请参考此处herehere。你可以尝试使用POSIXct吗? - Henrik
是的,我可以。而且你说得对,如果我将Start.Date和End.Date转换为POSIXct,dplyr就能正常工作!哇,这对我来说是一种奇怪的行为。你知道强制strptime创建POSIXct而不是POSIXlt的方法吗?我不想在读取文件后再进行两个单独的数据转换。 - Sergei
1
使用 as.POSIXct 代替 strptime。另一方面,你也可以将它们保留为“character”。至少在我看来,你展示的代码似乎并不真正依赖于 POSIX - Henrik
1
请先阅读?as.POSIXct,特别是 format 参数。 - Henrik
1
@ Sergei,我认为你现在已经有足够的信息来回答自己的问题了... - Ben Bolker
显示剩余3条评论
2个回答

7
软件包在处理日期方面非常有用。 以下代码用于解析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

如果这个问题已经被遗忘了,我很抱歉,但是当我看到每个人都建议转换为POSIX.ct或字符时,我感到很奇怪,因为我一直在使用更简单的解决方案,即从plyr包中调用arrange函数,使用plyr :: arrange ,因为它似乎没有与POSIXlt格式有关的问题。由于通常不是我在R中找到问题的最简单解决方案,所以我开始觉得有些问题。它是否与dplyr版本不同?


这是一个回答还是提出了一个新问题? - techspider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接