2015-10-29 2 views
0

У меня есть матрица данных, содержащая два столбца: значение, частота.
Я хочу сделать квадрат стоимости, взвешенный по частоте. Матрица сортируется по значению.R boxplot() и сводка() таблицы частот

> data[1:5,] 
    value freq 
1 28 1184 
2 29 1063 
3 30 1000 
4 31 976 
5 32 944 

Я прочитал много ответов о похожих проблемах, единственное, что я нашел, это. http://r.789695.n4.nabble.com/boxplot-with-frequencies-counts-td4660330.html

counts<-matrix(rep(data$value,data$freq), ncol=1, byrow=TRUE) 
boxplot(counts) 

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

+0

Вопрос: как вы производите данные со значением/частота? Я предполагаю, что данные должны быть в памяти. Возможно, поможет выборка. Вы можете соответствующим образом масштабировать столбец частоты. – fishtank

+0

Я проанализировал текстовые файлы с помощью Python, построил таблицу частот, суммируя файлы, а затем написал CSV-файл. Затем я использовал команду readcsv() в R. – BAMF4bacon

ответ

1

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

с использованием алмазов набора данных в библиотеке ggplot2

> count <- as.data.table(rep(diamonds$carat,diamonds$depth),ncol=1,byrow=TRUE) 
> count1 <- system.time(matrix(rep(diamonds$carat,diamonds$depth),ncol=1,byrow=TRUE)) 
> count1 
    user system elapsed 
    0.15 0.02 0.18 
> count <- system.time(as.data.table(rep(diamonds$carat,diamonds$depth),ncol=1,byrow=TRUE)) 
> count 
    user system elapsed 
    0.04 0.03 0.06 
+0

, на самом деле узкое место находится в коробке: 'system.time (boxplot (count1))' или 'system.time (boxplot (count))' оба занимает около 5 секунд. – fishtank

0

масштабирования вашего FREQ столбцов, вы можете преодолеть ограничение памяти и до сих пор получить тот же boxplot в вашем случае. См. Код ниже. Однако, если вы наблюдаете/подозреваете выбросы и хотите их использовать в своем ящике, вам придется обрабатывать их отдельно.

> data<-data.frame(value=c(28,29,30,31,32),freq=c(1184,1063,1000,976,944)) 
    > counts<-matrix(rep(data$value,data$freq), ncol=1, byrow=TRUE) 
    > length(counts) 
    [1] 5167 
    > boxplot(counts,at=1,xlim=c(0,3)) 
    > counts<-matrix(rep(data$value,round(data$freq/100)), ncol=1, byrow=TRUE) 
    > length(counts) 
    [1] 52 
    > boxplot(counts,at=2,add=T) 

enter image description here

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