频率表

时间:2015-10-29 17:44:22

标签: r matrix boxplot

我有一个包含两列的数据矩阵:value,freq。
我想制作一个价值的箱线图,按频率列加权。 矩阵按值排序。

> 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能够在其内存中执行此操作,但我正在使用虚拟机(Ubuntu)上的R工作,如果可能存在替代方法,我想知道真正的大数据集。也许有一个为此目的而建立的图书馆?

2 个答案:

答案 0 :(得分:1)

您需要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 

答案 1 :(得分: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