Ошибка аргумента breaks при использовании функции cut - PullRequest
0 голосов
/ 29 марта 2019

Я изучаю 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

Есть идеи, как это исправить? Это важное задание, над которым я работаю, поэтому любая помощь будет очень признательна!

1 Ответ

1 голос
/ 29 марта 2019

На самом деле нет необходимости использовать cut, вы можете просто использовать группы:

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
...