Ошибка ggplot2: оператор $ недопустим для атомов c - PullRequest
1 голос
/ 13 января 2020

Я пытаюсь построить график сравнения различий в процентах между разными брендами (используя гистограмму), сгруппированных по коэффициенту «Rate» с использованием ggplot2. Тем не менее, я получаю это сообщение об ошибке:

Error in percent_diff$percent_diff : 
  $ operator is invalid for atomic vectors

У меня есть два набора данных: процент_дифф и sem (стандартная ошибка среднего). Они оба были изменены со случайными данными для целей этого поста.

sem <- data.frame(brand = c('com','com','com','sus','sus','sus','tol','tol','tol'),
                  rate = c(1,
                           2,
                           3,
                           1,
                           2,
                           3,
                           1,
                           2,
                           3),
                  sem = c(-100.652190547299,
                          -20.9635462903477,
                          -92.887143790098,
                          -32.5321197096671,
                          -10.8046113120258,
                          -103.882668200279,
                          39.1133320990038,
                          50.641868900031,
                          27.3390542856909))

percent_diff <- data.frame(brand = c('com','com','com','sus','sus','sus','tol','tol','tol'),
                           rate = c(1,
                                    2,
                                    3,
                                    1,
                                    2,
                                    3,
                                    1,
                                    2,
                                    3),
                           percent_diff = c(-16.8547043500825,
                                            -123.651964249353,
                                            -70.2307389653605,
                                            -316.119165728843,
                                            -290.448196586088,
                                            -276.236250440114,
                                            23.6027946419299,
                                            35.415138795611,
                                            52.9344042281165))

Вот код, который я запускаю с пакетом ggplot2:

#Open ggplot package
library(ggplot2)


#Convert necessary columns to numeric for graphing
percent_diff$percent_diff <- as.numeric(percent_diff$percent_diff)
sem$sem <- as.numeric(sem$sem)

#Code to generate graph
ggplot(percent_diff, aes(x=brand, y=percent_diff, fill=factor(brand)))+
  geom_bar(stat="identity",width=0.6, position="dodge", col="black")+
  scale_fill_discrete(name="Rate", labels=c("1X", "2X", "3X"))+
  xlab("Brand")+ylab("Percent Difference (Compared to nontreated)")+
  geom_errorbar(aes(ymin= percent_diff$percent_diff, ymax=percent_diff$percent_diff+sem$sem), width=0.2, position = position_dodge(0.6))+
  ggtitle("Brand Comparison")+
  scale_fill_brewer(palette='Greys', name="Rate", labels=c("1X", "2X", "3X"))+
  theme(plot.title = element_text(hjust=0.5))

Затем возникает ошибка.

Чтобы проверить структуру набора данных, я сделал следующее, но все выглядит так, как я хотел:

'data.frame':   9 obs. of  3 variables:
 $ brand: Factor w/ 3 levels "com","sus","tol": 1 1 1 2 2 2 3 3 3
 $ rate : num  1 2 3 1 2 3 1 2 3
 $ sem  : num  100.7 21 92.9 32.5 10.8 …

str(percent_diff)
'data.frame':   9 obs. of  3 variables:
 $ brand       : Factor w/ 3 levels "com","sus","tol": 1 1 1 2 2 2 3 3 3
 $ rate        : num  1 2 3 1 2 3 1 2 3
 $ percent_diff: num  -16.9 -123.7 -70.2 -316.1 -290.4 …

Как я могу исправить это, так что график будет строить? Я уже запустил варианты этого кода, поэтому я знаю, что он может отображать график.

(Примечание. Отрицательные SEM должны создать будущий горизонтальный график, который будет отображать их с левой стороны оси.)

1 Ответ

4 голосов
/ 13 января 2020

Вы должны присоединиться к вашему фрейму данных и затем построить его без использования $. Здесь для примера я использую функцию left_join из dplyr, но существуют разные способы связывания двух фреймов данных.

library(ggplot2)
library(dplyr)
DF <- left_join(percent_diff, sem)

ggplot(DF, aes( x = brand, y = percent_diff, fill = factor(rate)))+
  geom_bar(stat="identity",width=0.6, position= position_dodge(), col="black")+
  scale_fill_discrete(name="Rate", labels=c("1X", "2X", "3X"))+
  xlab("Brand")+ylab("Percent Difference (Compared to nontreated)")+
  geom_errorbar(aes(ymin= percent_diff, ymax= percent_diff+sem), width=0.2, position = position_dodge(0.6))+
  ggtitle("Brand Comparison")+
  theme(plot.title = element_text(hjust=0.5))

enter image description here

...