2015-11-20 2 views
2

У меня есть данные о соотношении ответов для 4 экспериментальных групп с 2 различными статистическими данными, рассчитанными для каждой группы. Я хочу следующий рисунок (который можно достичь):R ggplot geom_bar Ошибка: дискретное значение, подаваемое на непрерывный масштаб

enter image description here

я получить эту цифру со следующим кодом:

Group<-c('a','b','c','d','a','b','c','d') 
Statistic<-c('Mean','Mean','Mean','Mean','d','d','d','d') 
Val<-c(.75,.83,.79,.69,.5,.02,.1,.3) 
dfm2<-data.frame(cbind(Group,Statistic,Val)) 
ggplot(dfm2,aes(x = Group,y = Val)) +  
geom_bar(aes(fill = Statistic),position = dodge',stat='identity') 

Однако, когда я изменить пределы оси у (на [0,1], так как у меня есть пропорции), добавив строку кода:

+ scale_y_continuous(limits=c(0, 1)) 

Я получаю

Error: Discrete value supplied to continuous scale 

Поэтому я понимаю, что это означает, что у меня есть непрерывная переменная. Я попытался преобразовать свою статистическую переменную, используя as.numeric() и множество других опций, но безрезультатно. Если кто-нибудь может помочь мне в решении этой проблемы и/или объяснить, что ее вызывает, я был бы очень благодарен.

ответ

4

Проблема заключается в ненужном использовании cbind внутри data.frame. cbind создает матрицу. Матрица должна иметь все значения одного и того же режима (числовые, символьные и т. Д.). Так как по крайней мере одна из переменных (в этом случае в этом случае) является символьным, то cbind также принимает значение Val. data.frame преобразует три символьные переменные в коэффициент. В любом случае, Val является дискретным (категориальным) значением, а не числовым, что приводит к ошибке при использовании scale_y_continuous.

Изменить на dfm2 <- data.frame(Group,Statistic,Val) и ошибка исчезнет.

Вы можете проверить эффект cbind и data.frame по типам данных следующим образом:

cbind(Group, Statistic, Val) 

    Group Statistic Val 
[1,] "a" "Mean" "0.75" 
[2,] "b" "Mean" "0.83" 
... 
[7,] "c" "d"  "0.1" 
[8,] "d" "d"  "0.3" 

dfm2<-data.frame(cbind(Group,Statistic,Val)) 
str(dfm2) 

'data.frame': 8 obs. of 3 variables: 
$ Group : Factor w/ 4 levels "a","b","c","d": 1 2 3 4 1 2 3 4 
$ Statistic: Factor w/ 2 levels "d","Mean": 2 2 2 2 1 1 1 1 
$ Val  : Factor w/ 8 levels "0.02","0.1","0.3",..: 6 8 7 5 4 1 2 3 

dfm2 <- data.frame(Group,Statistic,Val) 
str(dfm2) 

'data.frame': 8 obs. of 3 variables: 
$ Group : Factor w/ 4 levels "a","b","c","d": 1 2 3 4 1 2 3 4 
$ Statistic: Factor w/ 2 levels "d","Mean": 2 2 2 2 1 1 1 1 
$ Val  : num 0.75 0.83 0.79 0.69 0.5 0.02 0.1 0.3 

Если вы не хотите data.frame для преобразования строк к факторам, добавьте аргумент stringsAsFactors=FALSE.

+0

Ah! Спасибо, отлично работает. Даже когда я неправильно использовал cbind(), я вызвал dfm2 $ Val <-as.numeric (dfm2 $ Val) после создания моего фрейма данных. str (dfm2) показало $ Val как числовое; но у меня все еще есть ошибка. Поэтому я смутился. Любые идеи о том, почему настройка as.numeric() не работает? –

+0

У меня нет ошибки, когда я делаю преобразование 'as.numeric', а затем создаю его. Однако, когда вы конвертируете фактор-переменную, вам нужно сначала преобразовать в символ, а затем в числовой, иначе вы получите кодовые коды коэффициентов для уровней, а не фактические значения данных. Сравните 'dfm2 $ Val2 = as.numeric (dfm2 $ Val)' и 'dfm2 $ Val3 = as.numeric (as.character (dfm2 $ Val))'. – eipi10

0

Попробуйте следующее.

ggplot(dfm2,aes(x = Group,y = as.numeric(as.character(Val)))) +
geom_bar(aes(fill = Statistic),position = 'dodge',stat='identity')+ scale_y_continuous(limits=c(0, 1))