R boxplot() и summary() таблицы частот

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

> 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), и мне интересно, может ли быть альтернативный подход для действительно больших наборов данных. Возможно, есть библиотека, созданная для этой цели?


person BAMF4bacon    schedule 29.10.2015    source источник
comment
Вопрос: как вы производили данные со значением/частотой? Я предполагаю, что тогда данные должны быть в памяти. Возможно, метод выборки поможет. Вы можете соответствующим образом масштабировать столбец частоты.   -  person fishtank    schedule 29.10.2015
comment
Я проанализировал текстовые файлы с помощью Python, построил частотную таблицу, суммирующую файлы, а затем написал файл .csv. Затем я использовал команду readcsv() в R.   -  person BAMF4bacon    schedule 29.10.2015
comment
Вы можете использовать ggplot. У него есть параметр веса: /вопросы/34204175/   -  person Valdson    schedule 29.09.2019


Ответы (2)


Вам нужна библиотека data.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 
person Bg1850    schedule 29.10.2015
comment
на самом деле узкое место находится на диаграмме: system.time(boxplot(count1)) или system.time(boxplot(count)) оба занимают около 5 секунд. - person fishtank; 30.10.2015

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

    > 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)

введите здесь описание изображения

person fishtank    schedule 29.10.2015