Я столкнулся с ошибкой с фасетированием ggplot2 и dplyr group_by при использовании фрейма данных с переменной даты. Эта ошибка возникает только в том случае, если я сначала конвертирую переменную даты, а затем расплавляю фрейм данных. Если я сделаю наоборот, переменная будет точно такой же, но не выдаст ошибки. Пример:
#base df
df <- data.frame(
id = c("A", "B", "C"),
date1 = c("12/Sep/2010", "13/Mar/2011", "05/Jan/2010"),
date2 = c("13/Sep/2010", "14/Mar/2011", "06/Jan/2010"),
value1 = 1:3,
value2 = 4:6
)
df
id date1 date2 value1 value2
1 A 12/Sep/2010 13/Sep/2010 1 4
2 B 13/Mar/2011 14/Mar/2011 2 5
3 C 05/Jan/2010 06/Jan/2010 3 6
Я покажу пример с mutate, но использование df $ date ‹- as.Date (df $ date) дает ту же ошибку. Прошу прощения или уродливый и неэффективный код для очистки моих данных (предложения приветствуются :-)).
#mutate first
df_muta <- df %>% mutate_each(funs(as.Date(., format = "%d/%b/%Y")), c(starts_with("date")))
df_muta <- data.frame(
id = melt(df_muta, id.vars = c("id"), measure.vars = c("date1", "date2"))[[1]],
date = melt(df_muta, id.vars = c("id"), measure.vars = c("date1", "date2"))[[3]],
value = melt(df_muta, id.vars = c("id"), measure.vars = c("value1", "value2"))[[3]])
str(df_muta)
'data.frame': 6 obs. of 3 variables:
$ id : Factor w/ 3 levels "A","B","C": 1 2 3 1 2 3
$ date : Date, format: "2010-09-12" "2011-03-13" "2010-01-05" ...
$ value: int 1 2 3 4 5 6
p <- ggplot(df_muta, aes(x = date, y = value)) + geom_point()
Я хотел опубликовать сюжет, но у меня еще нет 10 репутации, чтобы сделать это. Единственный график выше в порядке, с датами на оси x. Если я попытаюсь выполнить фасетирование, ось x будет преобразована в числовую.
p + facet_wrap( ~ id)
И если я попытаюсь использовать dplyr group_by, это тоже приведет к ошибке.
df_muta %>% group_by(id)
Error: column 'date' has unsupported type
Итак, я попробовал сначала растопить, а затем преобразовать дату.
df_melt <- data.frame(
id = melt(df, id.vars = c("id"), measure.vars = c("date1", "date2"))[[1]],
date = melt(df, id.vars = c("id"), measure.vars = c("date1", "date2"))[[3]],
value = melt(df, id.vars = c("id"), measure.vars = c("value1", "value2"))[[3]])
df_melt <- df_melt %>% mutate(date = as.Date(date, format = "%d/%b/%Y"))
str(df_melt)
'data.frame': 6 obs. of 3 variables:
$ id : Factor w/ 3 levels "A","B","C": 1 2 3 1 2 3
$ date : Date, format: "2010-09-12" "2011-03-13" "2010-01-05" ...
$ value: int 1 2 3 4 5 6
Структура и значения обоих фреймов данных кажутся точно такими же, но последний не даст никаких ошибок с осью графика фасета или group_by. Это ошибка? В чем разница между объектами даты?
Спасибо!