ошибка geom_vline и facet_wrap в ggplot

#r #ggplot2

#r #ggplot2

Вопрос:

Я пытаюсь запустить следующий код:

 temp_plotdata <- data.table(Treatment_Code = c('Control', 'Control', 
                                               'Second Mailing', 'Second Mailing', 
                                               'First Mailing', 'First Mailing'),
                            Q9 = c(9, 14, 10, 3, 1, 4))

output_gg <-
  ggplot(temp_plotdata, aes(x = Q9))  
  geom_histogram(binwidth = 1, fill = 'lightblue')  
  geom_vline(data = temp_plotdata[, summary(Q9)[c(2,3,5)], by=Treatment_Code],
             aes(xintercept = V1),
             linetype = 'dashed', color = 'darkred')  
  facet_wrap(~Treatment_Code, ncol = 1)
  

Я возвращаю ошибку:

Ошибка в предоставленных именах (x, sep = sep, base = base): ‘dimnames’ применяется к не массиву

Я знаю, что проблема в geom_vline части кода, потому что, когда я запускаю его без этих строк или с чем-то вроде geom_vline(xintercept = c(3, 5, 8)) , он работает нормально. Я также попытался сначала преобразовать данные из geom_vline в отдельный фрейм данных, но это не сработало.

В прошлом году я запускал очень похожий фрагмент кода, и он работал нормально, поэтому я не уверен, изменилось ли что-то с geom_vline или мой код просто некорректен из-за новых данных или какого-то небольшого изменения, которое я, возможно, случайно внес.

Спасибо за любую помощь, которую вы можете оказать.

Комментарии:

1. Я использую 2.1.0. Я думаю, что это последняя версия.

Ответ №1:

Это происходит потому, что класс V1 (итоговый столбец, возвращаемый data.table ) является таблицей, а не числовым вектором. Измените его на вектор, и он должен работать.

 output_gg <-
  ggplot(temp_plotdata, aes(x=Q9))  
  geom_histogram(binwidth=1, fill='lightblue')  
  geom_vline(data=temp_plotdata[, as.vector(summary(Q9)[c(2,3,5)]), by=Treatment_Code],
             aes(xintercept=V1),
             linetype='dashed', color='darkred')  
  facet_wrap(~ Treatment_Code, ncol=1)
  

Сравните структуру фрейма данных до и после:

 str(temp_plotdata[, summary(Q9)[c(2,3,5)], by=Treatment_Code])
  
 Classes ‘data.table’ and 'data.frame':    9 obs. of  2 variables:
  $ Treatment_Code: chr  "Control" "Control" "Control" "Second Mailing" ...
  $ V1            :Class 'table'  num [1:9] 10.25 11.5 12.75 4.75 6.5 ...
- attr(*, ".internal.selfref")=<externalptr>
  
 str(temp_plotdata[, as.vector(summary(Q9)[c(2,3,5)]), by=Treatment_Code])
  
 Classes ‘data.table’ and 'data.frame':    9 obs. of  2 variables:
  $ Treatment_Code: chr  "Control" "Control" "Control" "Second Mailing" ...
  $ V1            : num  10.25 11.5 12.75 4.75 6.5 ...
- attr(*, ".internal.selfref")=<externalptr>