【问题标题】:Error on breaks argument when using the cut function使用 cut 函数时中断参数出错
【发布时间】:2019-03-29 10:14:07
【问题描述】:

我正在学习 R,我需要根据以下数据创建一个双向表:

> head(datanet)
   Date & Time [Local]  distance travelled
1:    18/06/2018 03:08  15.959366
2:    18/06/2018 03:12  22.535566
3:    18/06/2018 03:16  12.036834
4:    18/06/2018 03:20  18.738134
5:    18/06/2018 03:24  26.781879
6:    18/06/2018 03:28  8.341659

我想要的输出应该如下表所示,有一个 hour 列条目代表一天中的时间(一天中 24 小时的 24 个条目)和几个 dist_tra on yyyy-mm-dd 条目,每个条目的平均每小时行驶距离一天中的每个小时。像这样:

head(dist.byHour[1:3])
  hour dist_tra on 06/07/2018  dist_tra on 06/08/2018
1:   00              25.834355              29.388140
2:   01                     NA               8.329956
3:   02                     NA              31.506390
4:   03              33.464954              20.995957
5:   04               6.406513              17.035749
6:   05              28.254438              38.803171

通过在线查找并与一些同事交谈,我得到了下面的脚本。但是,我在使用 cut() 时收到了不想要的错误消息:

library(tidyverse)

datanet$datehour <- cut(datanet[[1]], breaks = "hours")

dist.byHour <- aggregate(meters ~ datehour, datanet, mean, na.rm = TRUE)
dist.byHour$datehour <- as.POSIXct(dist.byHour$datehour)
dist.byHour$hour <- format(dist.byHour$datehour, "%H")
dist.byHour$datehour <- as.Date(dist.byHour$datehour)
dist.byHour <- dist.byHour[c(3, 1, 2)]

dist.byHour <- dist.byHour %>%
  spread(datehour, -hour)

names(dist.byHour)[-1] <- paste("dist_tra on", names(dist.byHour)[-1])

错误是:

> datanet$datehour <- cut(datanet[[1]], breaks = "hours")
Error in cut.default(datanet[[1]], breaks = "hours") : 
  'x' must be numeric

关于如何解决这个问题的任何想法?这是我正在处理的一项重要任务,因此非常感谢任何帮助!

【问题讨论】:

  • 您需要将日期时间字符串强制转换为实际的日期时间类您使用cut 之前而不是之后。
  • @Roland 感谢您的留言。你说的强迫是什么意思?考虑到我拥有的数据类型 (datanet),有没有一种快速的方法可以做到这一点?

标签: r cut


【解决方案1】:

其实不用cut,直接用group就行了:

library(lubridate)
library(tidyverse)

# sample data
date <- c("18/06/2018 03:08", "18/06/2018 03:12", "18/06/2018 04:20", "19/06/2018 03:16", "19/06/2018 03:20", "19/06/2018 04:20")
distance <- c(15.959366,  22.535566, 12.036834,  18.738134, 12.036834, 22.535566)

df <- data.frame(date, distance)

df %>% 
  mutate(date = dmy_hm(date)) %>% #coerce to date object
  group_by(day = date(date), hour = hour(date)) %>% # group by day and hour
  summarise(dist = mean(distance)) %>% # average distance traveled in that hour
  spread(day, dist) # re-arrange dataframe

【讨论】:

  • 谢谢!这工作完美。我想知道是否有可能包含以与我原始帖子的head(dist.byHour[1:3]) 示例相同的方式格式化日期的列标题?现在列标题格式为yyyy-mm-dd 而不是mm/dd/yyyy。希望你能告诉我一些事情!
  • 要么玩弄日期格式,要么在最后用set_names(c("hour", "dist_tra on 06/07/2018", "dist_tra on 06/08/2018")) 破解它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
相关资源
最近更新 更多