Как агрегировать символ и числовое значение без получения ошибки недопустимого символа - PullRequest
2 голосов
/ 28 апреля 2019

Я хотел бы построить следующие данные:

structure(list(`Sunday NightShifts` = c(2, 3, 3, 3, 3), 
               time = c("t0400_0415_d1", "t0415_0430_d1", "t0430_0445_d1", "t0445_0500_d1", "t0500_0515_d1"),
               day = c("Sunday", "Sunday", "Sunday", "Sunday", "Sunday"), 
              `Monday NightShifts` = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), 
              `Tuesday NightShifts` = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), 
              `Wednesday NightShifts` = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), 
              `Thursday NightShifts` = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), 
              `Friday NightShifts` = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_)), 
              row.names = c(NA, 5L), class = "data.frame")

, используя график в обратном направлении, мой код следующий:

df <- as_data_frame(NightShifts) %>% 
  mutate(timeofday = rownames(NightShifts)) %>% 
mutate(timeofday = as.POSIXct(paste0("2000-01-01 ", timeofday, ":00")))


df_long <- df %>% 
            gather("activity", "value", -timeofday) %>% 
            group_by(timeofday) %>% 
       mutate(rel_value = value / sum(value))

Однако после вышеприведенной строки (mutate(rel_value = value / sum(value))) я получаюследующая ошибка:

Error in sum(value) : invalid 'type' (character) of argument

Это из-за NA?

# plot the values as an area-plot
ggplot(df_long, aes(x = timeofday, y = rel_value, fill = activity)) + geom_area(aes(fill=activity)) + labs(x="Time", y="Probabilities", colour="NightShifts", fill="NightShifts") + 

  theme(legend.position="right", axis.text.x = element_text(angle = 90, hjust = 1))

Я запускаю traceback ():

11: eval(cols[[col]], .data, parent.frame())
10: eval(cols[[col]], .data, parent.frame())
9: mutate(., rel_value = value/sum(value))
8: function_list[[k]](value)
7: withVisible(function_list[[k]](value))
6: freduce(value, `_function_list`)
5: `_fseq`(`_lhs`)
4: eval(quote(`_fseq`(`_lhs`)), env, env)
3: eval(quote(`_fseq`(`_lhs`)), env, env)
2: withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
1: df %>% gather("activity", "value", -timeofday) %>% group_by(timeofday) %>% 
       mutate(rel_value = value/sum(value))

Не могли бы вы помочь мне решить эту ошибку?

Также у меня есть основной вопрос, как изменитьэтот код

as.POSIXct(paste0("2000-01-01 ", timeofday, ":00")))

для отображения времени в часах и минутах (без даты), начиная с 04:00 и заканчивая 03:45.

Большое спасибо

1 Ответ

3 голосов
/ 28 апреля 2019

Если нам нужна разница в единицах в минутах, разделите столбец 'time' на два ('time1', 'time2) с помощью extract (из tidyr), преобразуйте в класс Datetime (as.POSIXct), чтобы получить разницу между столбцами и добавьте с помощью столбца «Sunday NightShifts»

library(tidyverse)
NightShifts %>% 
   extract(time, into = c("time1", "time2"), 
         "^t(\\d+)_(\\d+)_.*", remove = FALSE) %>%
   mutate_at(vars(time1, time2), as.POSIXct, format = "%H%M") %>% 
   mutate(Diff = as.numeric(difftime(time2, time1, unit = "min") + 
            `Sunday NightShifts`))
...