Сбор данных, поиск результатов по группам и построение графиков с использованием R - PullRequest
4 голосов
/ 02 марта 2011

Предустановленный набор данных о землетрясениях имеет 5 переменных и 1000 наблюдений.

Простой график, который я пытаюсь создать, должен показать среднюю величину землетрясения по категории глубины землетрясения (то есть ось Y = величина, ось X = категории глубины).

В этом наборе данных переменные глубины землетрясения варьируются от 40 до 680. Я хотел бы превратить 1000 наблюдений глубины землетрясения в 8 категорий, например, 40 - 120, 121 - 200, ... 600 - 680. Затем я хотел бы взять среднюю величину землетрясения по категории глубины и нанести ее на линейный график.

Я ценю любую помощь с этим. Спасибо!

Ответы [ 4 ]

9 голосов
/ 02 марта 2011

Сначала классифицируйте по классам глубины с вырезом:

depth.class <- cut(quakes$depth, c(40, 120, 200, 300, 400, 500, 600, 680), include.lowest = TRUE)

(Обратите внимание, что определения вашего класса могут отличаться в зависимости от того, что вы ищете, и учитывая подробности поведения cut ()).

Найти среднюю величину в пределах каждой глубины. Класс (предполагается, что нет NA):

mean.mag <- tapply(quake$mag, depth.class, mean)

(При необходимости добавьте na.rm, например, mean.mag <- tapply(quake$mag, depth.class, mean, na.rm = TRUE) для наборов данных с пропущенными значениями).

Участок в виде линии:

plot(mean.mag, type = "l", xlab = "magnitude class")

Это небольшая дополнительная работа, чтобы поместить метки классов на ось X, но в этот момент вы можете спросить, действительно ли линейный график здесь уместен.

Быстрый удар, выключите оси, а затем поднимите классы прямо из коэффициента выреза:

plot(mean.mag, type = "l", xlab = "magnitude class", axes = FALSE)
axis(1, 1:nlevels(depth.class), levels(depth.class))
axis(2)
box()
4 голосов
/ 02 марта 2011

Линейный график здесь не нужен;Какое отношение линии между точками представляют в данных?Возможно, вместо этого может быть полезна точечная диаграмма?

cats <- with(quakes, cut(depth, breaks = seq(40L, max(depth), by = 80), 
                         include.lowest = TRUE))
dat <- aggregate(mag ~ cats, data = quakes, FUN = mean)
with(dat, dotchart(mag, group = cats, xlab = "Mean Magnitude"))

Что дает:

enter image description here

2 голосов
/ 02 марта 2011

Я согласен, что вы, скорее всего, не хотите линейный график, а скорее dotplot() или диаграмму какого-либо вида.

Вы можете легко сделать это, используя дранку из пакета решеток:

library(lattice)
x <- runif(100)
y <- runif(100)
bwplot(~x|equal.count(y))

Замена shingle() на equal.count() позволит вам указать интервалы вместо того, чтобы позволить R выбирать их для вас.

box plots with shingles

2 голосов
/ 02 марта 2011

Вы уверены, что хотите линейный сюжет здесь? Я не уверен, что это наиболее подходящий сюжет для использования здесь. В любом случае, хитрость здесь заключается в том, чтобы использовать cut для надлежащего связывания данных, а затем использовать один из многих инструментов агрегирования, чтобы найти среднюю величину по этим группам. Наконец, мы построим эти агрегированные значения. Мне нравятся инструменты в ggplot2 и plyr для таких задач:

library(ggplot2)
df <- quakes
df$bins <- with(df, cut(depth, breaks = c(0,40, 120, 200, 280, 360, 440, 520, 600, 680)))
df.plot <- ddply(df, .(bins), summarise, avg.mag = mean(mag))
qplot(bins, avg.mag, data = df.plot)

#If you want a line plot, here's one approach:
qplot(as.numeric(bins), avg.mag, data = df.plot, geom = "line") + 
xlim(levels(df.plot$bins))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...