2016-04-17 3 views
1

Я относительно не знаком с R и новичком с ggplot, но мне не удалось найти ответ на кажущуюся простой проблему. Используя ggplot, я хотел бы составить гистограмму, в которой складываются два из трех или более уровней графа.Уровни группирования/уровня стекирования в гистограмме ggplot

По сути, это тип данных, я смотрю на:

df <- data.frame(Answer=c("good","good","kinda good","kinda good", 
    "kinda good","good","bad","good","bad")) 

Это дает мне фактор с тремя уровнями, два из которых очень похожи:

 Answer 
1  good 
2  good 
3 kinda good 
4 kinda good 
5 kinda good 
6  good 
7  bad 
8  good 
9  bad 

Если я пусть ggplot переходят эти данные для меня теперь,

c <- ggplot(df, aes(df$Answer)) 
c + geom_bar() 

enter image description here

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

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

df <- data.frame(Answer=c("good","goood","goo0d","good", 
    "I don't know","Bad","bad","baaad","really bad")) 

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

Я подумал о двух разных подходах к более эффективно решать эту проблему:

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

Я мог бы разделить соответствующий столбец/коэффициент на два отдельных столбца/коэффициенты и нарисовать их рядом друг с другом и таким образом создать «поддельное» третье измерение. Это выглядит как наиболее перспективный подход, но прежде чем я буду работать через 100 столбцов данных, есть ли более элегантный подход, возможно, в пакете ggplot2, где я мог бы просто указать/сгруппировать имена уровней вместо изменения/переупорядочения кадр данных за ним?

Спасибо!

+0

'ggplot (ДФ, АЕС (grepl («хороший», ответ) , fill = Answer)) + geom_bar() 'будет грубо.в основном это класть группы на x (хорошо или не хорошо) и раскрасить «Ответ» – rawr

+0

Спасибо за ответ так быстро, за редактирование и, конечно, за ответ! Это хорошо работает с двумя группами! Поскольку вы только отправили свой ответ в качестве комментария, я предполагаю, что может быть другое решение, если мне нужно сгруппировать десять уровней в три столбца? – Sarah

+0

Я стараюсь не поощрять ggplot:} группировать несколько групп на меньшее, не проблема ggplot. если вы хотите сделать n-группы, 'grepl' не будет чрезвычайно полезен. если вы разместите некоторые данные, которые больше похожи на то, что вам нужно (а не только на два уровня), это помогло бы – rawr

ответ

2

Вы можете попробовать следующее для более автоматизированного подхода при группировке ответов.

Мы выбираем несколько ключевых слов на основе ваших данных и перебрать их увидеть, какие ответы могут содержать каждое ключевое слово

groups <- c('good','bad','ugly','know') 

df <- data.frame(Answer=c("good","medium good","kinda good","still good", 
          "I don't know","good","bad","good","really bad")) 

idx <- sapply(groups, function(x) grepl(x, df$Answer, ignore.case = TRUE)) 
df$group <- rep(colnames(idx), nrow(idx))[t(idx)] 
df 

#   Answer group 
# 1   good good 
# 2 medium good good 
# 3 kinda good good 
# 4 still good good 
# 5 I don't know know 
# 6   good good 
# 7   bad bad 
# 8   good good 
# 9 really bad bad 


library('ggplot2') 
ggplot(df, aes(group, fill = Answer)) + geom_bar() 

enter image description here

+0

Спасибо! Пройдя это тщательно, я наконец понял, что это именно то, что мне нужно. Похоже, нам всегда будет нужен дополнительный столбец в df, но это, вероятно, так хорошо. Так что спасибо за ваше время и помогаем мне :) – Sarah

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