Как отсортировать кадр данных по среднему значению подмножеств одной из строк? - PullRequest
3 голосов
/ 26 апреля 2011

Я довольно новичок в R, но у меня хороший прогресс.Я смог согнуть ggplot2 по своей воле, за исключением одного: порядка, в котором метки категорий размещаются вдоль оси x в моем блокпосте.Я думаю, что это всего лишь дыра в моих знаниях о том, как обращаться к диапазонам фрейма данных в формулах, но вот фальшивые данные в виде фрейма данных с именем df:

Index    Label    Value
index1   A        1
index2   A        2
index3   A        3
index4   B        12
index5   B        11
index6   B        10
index7   C        8
index8   C        7
index9   C        9
...
index76  Z        15
index77  Z        17
index78  Z        16

Мой код графика выглядит как qplot(df$Label, df$Value, data=df) + scale_x_discrete("Label") + opts(axis.text.x = theme_text(angle = 90, hjust = 0, size=7)) + geom_boxplot()и дает мне именно то, что я хочу, то есть блок-график, показывающий одну коробку и усы для метки A, одну для B и одну для C. Однако, ось идет в порядке меток (boxplot из 1,2,3находясь ближе всего к началу координат, 10,11,12 посередине, 7,8,9 справа от графика).То, что я хочу, чтобы данные коробочного графика начинались с подмножества, которое имеет наивысшее значение в среднем по метке, и продолжалось в порядке убывания.Я могу усреднить в пределах каждой метки значения mean(df$Label[1:3]) и mean(df$Label[4:6]) и т. Д., Но не могу понять, как заставить график отображаться так, чтобы графики для меток шли не в том порядке, в котором они отображаются в factor(df$Label) (то есть A, B, C вдоль x с блоками в 2, 11, 8), но в порядке от наивысшего среднего в пределах метки к низшему (то есть B, C, An вдоль x и в блоках затем в 11, 8, 2).

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

Что мне нужно знать, это:

Как лучше всего получить вектор, состоящий из средних значений каждой метки в порядке от самого высокого до самого низкого?

Какпередать этот вектор в ggplot, чтобы он упорядочивал ось X по этим значениям, в то же время помечая ось x с помощью factor(df$Label)

Я открыт для предложений по другим способам отображенияданные, но я думаю, что я довольно близок к тому, что я хочу, и среднее& разброс значений внутри данного ярлыка важен.

Ответы [ 2 ]

5 голосов
/ 26 апреля 2011

Вот один из способов сделать это

# create a dummy data frame
set.seed(1234)
df = data.frame(
       label = rep(letters[1:3], each = 3),
       value = sample(100, 9))

# boxplot without sorting
qplot(label, value, data = df, geom = 'boxplot')

enter image description here

# boxplot with label sorted by median of value
qplot(reorder(label, value, median), value, data = df, geom = 'boxplot')

enter image description here

0 голосов
/ 26 апреля 2011

Label является фактором. Попробуйте as.numeric(df$Label), чтобы увидеть, какому числу соответствует каждый уровень фактора. Вполне вероятно, что ggplot2 использует метки в порядке их числового уровня. Вы можете упорядочить уровни фактора, передав аргумент levels в factor. Например, если у вас есть каждая из меток в векторе в том порядке, в котором вы хотите, ordered.levels=c("B","C","A",...), то вы можете «переупорядочить» метки путем преобразования в символ и обратно с явным аргументом levels: df$Label <- factor(as.character(df$Label), levels=ordered.levels).

Все это предполагает, что ggplot2 использует числовые значения уровней для упорядочения графиков.

...