2016-01-05 9 views
-1

Я недавно работал с некоторым выходом, и я не могу представить его информативно. Выход выглядит следующим образом:R - агрегирование данных в dataframe

180,A,71 
180,C,61 
180,G,68 
180,U,78 
182,A,70 
182,C,34 
182,G,123 
182,U,51 

Я хотел бы построить эти данные так что я на оси х в первой колонке, а на оси стержней у, которые заполняются в соответствии с четырьмя различными типами (колонка 2) и их частоты (столбец 3). Таким образом, на оси y будет частота всех типов по одному значению из первого столбца, но этот бар будет разделен в зависимости от размера типов.

Надеюсь, что вопрос был ясен и спасибо за любую помощь.

+2

Что на ваш вопрос именно? Что вы уже пробовали? – Heroka

+0

Я пробовал агрегат (y ~ x, data = data), и я не знаю, как создать график с барами, состоящими из фракций. –

+2

Возможный дубликат [Строковый график штриховки в r с суммированными данными] (http://stackoverflow.com/questions/16630069/stacked-bar-plot-in-r-with-summarized-data). Однако ваши данные уже в правильном формате. – Heroka

ответ

1

Как это?

df <- data.frame(X=rep(c(180,182), each=4), Group=rep(c("A","C","G","U"),2), 
      Y=c(71,61,68,78,70,34,123,51)) 

# Calculating percentages (just using base) 
groupSum <- tapply(df$X, df$Group, sum) 
df$Label <- paste0(round(100 * df$Y/groupSum[df$Group], 1), "%") 

# Go for the plot 
library(ggplot2) 

ggplot(data=df, aes(x=X, y=Y,fill=Group)) + 
    geom_bar(position="dodge", stat="identity") + 
    scale_x_continuous(breaks=unique(df$X)) 

В последней части указаны только фактические значения х. enter image description here

И это то, что @ сюжет Haroka был бы выглядеть (с процентами теперь добавлены по желанию - также see here):

ggplot(data=df, aes(x=X, y=Y,fill=Group)) + 
    geom_bar(position="stack", stat="identity") + 
    scale_x_continuous(breaks=unique(df$X)) + 
    geom_text(aes(label = Label), size=12, hjust=0.5, vjust=3, position="stack") 

enter image description here

+0

Одновременный ответ с @Heroka – dougmet

+0

Спасибо, я пробовал, и он работает, еще одна вещь: как положить x только значения в данных а не значения между ними? –

+0

Я использую функции масштабирования для этого: '+ scale_x_continuous (breaks = unique (df $ X))' Уникальный не является строго необходимым, но более расширяемым. Обновит ответ. – dougmet

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