Преобразовать абсолютные значения в диапазоны для построения графиков в R - PullRequest
3 голосов
/ 09 сентября 2011

Предупреждение: все еще новичок в R.

Я пытаюсь построить некоторые диаграммы (в частности, пузырьковую диаграмму) в R, которые показывают политические пожертвования для кампании. Идея состоит в том, что ось X будет отображать количество вкладов, ось Y - количество вкладов, а площадь кружков - общую сумму, внесенную на этом уровне.

Данные выглядят так:

CTRIB_NAML    CTRIB_NAMF    CTRIB_AMT    FILER_ID
John          Smith         $49          123456789

Поле FILER_ID используется для фильтрации данных по конкретному кандидату.

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

vals<-sort(unique(dfr$CTRIB_AMT))
sums<-tapply( dfr$CTRIB_AMT, dfr$CTRIB_AMT, sum)
counts<-tapply( dfr$CTRIB_AMT, dfr$CTRIB_AMT, length)

symbols(vals,counts, circles=sums, fg="white", bg="red", xlab="Amount of Contribution", ylab="Number of Contributions")
text(vals, counts, sums, cex=0.75)

Однако это приводит к слишком большому количеству интервалов по оси X. Всего есть несколько миллионов записей, и разделение на некоторых кандидатов может привести к огромному количеству данных. Как я могу преобразовать абсолютные вклады в диапазоны? Например, как я могу сгруппировать vals в диапазоны, например, 0-10, 11-20, 21-30 и т. Д .?

---- EDIT ----

Следуя комментариям, я могу преобразовать vals в числовое значение, а затем разделить на интервалы, но я не уверен, как потом объединить это обратно в синтаксис пузырьковой диаграммы.

new_vals <- as.numeric(as.character(sub("\\$","",vals)))
new_vals <- cut(new_vals,100)

Но перефразируя:

symbols(new_vals,counts, circles=sums)

Не имеет смысла - все значения выстраиваются в ноль на оси X.

1 Ответ

1 голос
/ 14 октября 2011

Теперь, когда вы сложили значения в множители с cut, вы можете просто использовать tapply снова, чтобы найти значения и суммы с использованием этих новых разрывов.Например:

counts = tapply(dfr$CTRIB_AMT, new_vals, length)
sums   = tapply(dfr$CTRIB_AMT, new_vals, sum)

Однако для такого типа вещей вам могут пригодиться пакеты plyr и ggplot2.Вот полный воспроизводимый пример:

require(ggplot2)

# Options
n = 1000
breaks = 10

# Generate data
set.seed(12345)
CTRIB_NAML = replicate(n, paste(letters[sample(10)], collapse=''))
CTRIB_NAMF = replicate(n, paste(letters[sample(10)], collapse=''))
CTRIB_AMT  = paste('$', round(runif(n, 0, 100), 2), sep='')
FILER_ID   = replicate(10, paste(as.character((0:9)[sample(9)]), collapse=''))[sample(10, n, replace=T)]

dfr = data.frame(CTRIB_NAML, CTRIB_NAMF, CTRIB_AMT, FILER_ID)

# Format data
dfr$CTRIB_AMT = as.numeric(sub('\\$', '', dfr$CTRIB_AMT))
dfr$CTRIB_AMT_cut = cut(dfr$CTRIB_AMT, breaks)

# Summarize data for plotting
plot_data = ddply(dfr, 'CTRIB_AMT_cut', function(x) data.frame(count=nrow(x), total=sum(x$CTRIB_AMT)))

# Make plot
dev.new(width=4, height=4)
qplot(CTRIB_AMT_cut, count, data=plot_data, geom='point', size=total) + opts(axis.text.x=theme_text(angle=90, hjust=1))

enter image description here

...