我有一个包含两列的数据矩阵: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工作,如果可能存在替代方法,我想知道真正的大数据集。也许有一个为此目的而建立的图书馆?
答案 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)