2016-07-22 1 views
1

Я пытаюсь создать сгруппированный штрих-код с частотой (%) по оси y и depression_meds (N/Y) по оси x, сгруппированный по другой переменной score (LOW /ВЫСОКАЯ).barplot(): Частотные проценты на группу

Мой код до сих пор:

meds <- table(data2$depression_meds,data2$score)/sum(table(data2$score)) * 100 
bp <- barplot(meds, beside=TRUE, axes=FALSE, xlab="Anti-depression meds use", names=c("No", "Yes"), col=c("azure3", "azure"), ylab="Frequency (%)", ylim=c(0,100)) 
axis(2, at=seq(0,100,10)) 
legend("topright", legend=c("LOW", "HIGH"), bty="n", fill=c("azure3", "azure")) 
text(bp, 0, round(medtimerx, 1), cex=1, pos=3) 

Который является большим, и делает следующий barplot:

enter image description here

Но проценты используют общую п 243 (3-й столбец таблицы ниже), а не n на группу баллов (1-й и 2-й столбцы в таблице ниже), что имеет смысл, потому что это то, что я делаю, когда я делясь на сумму. Но этого я не хочу. Я продолжаю пытаться получить частоты за группу баллов, чтобы четыре бара соответствовали 1-му и 2-м столбцам ниже, но у меня закончились идеи. У кого-нибудь есть предложения?

Depression meds (0=N, 1=Y) LOW (N=99) HIGH (N=144) TOTAL (N=243) 
         0 96 (97.0%) 116 (80.6%) 212 (87.2%)  
         1 3 (3.0%)  28 (19.4%)  31 (12.8%) 

Вот мои данные:

> dput(data2) 
structure(list(depression_meds = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 
0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 
0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L), score = c(1L, 
1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 
0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L)), .Names = c("depression_meds", "score"), row.names = c(NA, 
-243L), class = "data.frame") 

Спасибо за вашу помощь, мой мозг не работает больше.

ответ

1

Используйте это для сводной таблицы:

meds <- table(data2) 

#    score 
#depression_meds 0 1 
#    0 96 124 
#    1 3 20 

meds <- scale(meds, FALSE, colSums(meds)) * 100 

#    score 
#depression_meds   0   1 
#    0 96.969697 86.111111 
#    1 3.030303 13.888889 

Нет необходимости менять остальную часть кода:

bp <- barplot(meds, beside=TRUE, axes=FALSE, xlab="Anti-depression meds use", names=c("No", "Yes"), col=c("azure3", "azure"), ylab="Frequency (%)", ylim=c(0,100)) 
axis(2, at=seq(0,100,10)) 
legend("topright", legend=c("LOW", "HIGH"), bty="n", fill=c("azure3", "azure")) 
text(bp, 0, round(meds, 1), cex=1, pos=3) 

enter image description here

+0

Удивительный. Спасибо огромное! – nchimato

3

Использование prop.table в данном случае очень подходящий, который предоставляет параметр margin для указания по строке или вычислению вероятности столбца:

meds <- prop.table(table(data2), margin = 2) * 100 
meds 
#    score 
# depression_meds   0   1 
#    0 96.969697 86.111111 
#    1 3.030303 13.888889 

enter image description here

+0

Проверял еще один ответ, прежде всего, чтобы получить его, но проголосовал за использование prop.table, я буду помнить об этом в будущем. Спасибо! – nchimato

+0

Обязательно. Неважно, какой ответ вы принимаете. Это не так много. – Psidom

Смежные вопросы