对要绘制的大数值向量进行分组和平均

时间:2016-08-16 18:05:51

标签: r plot

我有一个非常数据密集的R矩阵。它有500,000行。如果我将1:500000(x轴)绘制到矩阵mat[, 3]的第三列,则绘制时间太长,有时甚至会崩溃。我尝试了plotmatplotggplot,所有这些都需要很长时间。

我希望将数据分组10或20.即,从向量中取出前10个元素,将其平均,然后将其用作数据点。

有快速有效的方法吗?

1 个答案:

答案 0 :(得分:1)

我们可以使用cutaggregate来减少绘制的点数:

生成一些数据

set.seed(123)
xmat <- data.frame(x = 1:5e5, y = runif(5e5))

使用cutaggregate

xmat$cutx <- as.numeric(cut(xmat$x, breaks = 5e5/10))
xmat.agg <- aggregate(y ~ cutx, data = xmat, mean)

制作情节

plot(xmat.agg, pch = ".")

enter image description here

超过1列解决方案:

在这里,我们使用data.table包进行分组和汇总:

生成一些更多数据

set.seed(123)
xmat <- data.frame(x = 1:5e5, 
                   u = runif(5e5),
                   z = rnorm(5e5),
                   p = rpois(5e5, lambda = 5),
                   g = rbinom(n = 5e5, size = 1, prob = 0.5))

使用data.table

library(data.table)
xmat$cutx <- as.numeric(cut(xmat$x, breaks = 5e5/10))
setDT(xmat) #convert to data.table
#for each level of cutx, take the mean of each column
xmat[,lapply(.SD, mean), by = cutx] -> xmat.agg

#  xmat.agg
#         cutx        x         u            z   p   g
#     1:     1      5.5 0.5782475  0.372984058 4.5 0.6
#     2:     2     15.5 0.5233693  0.032501186 4.6 0.8
#     3:     3     25.5 0.6155837 -0.258803746 4.6 0.4
#     4:     4     35.5 0.5378580  0.269690334 4.4 0.8
#     5:     5     45.5 0.3453964  0.312308395 4.8 0.4
#    ---                                              
# 49996: 49996 499955.5 0.4872596  0.006631221 5.6 0.4
# 49997: 49997 499965.5 0.5974486  0.022103345 4.6 0.6
# 49998: 49998 499975.5 0.5056578 -0.104263093 4.7 0.6
# 49999: 49999 499985.5 0.3083803  0.386846148 6.8 0.6
# 50000: 50000 499995.5 0.4377497  0.109197095 5.7 0.6

全部绘制

par(mfrow = c(2,2))
for(i in 3:6) plot(xmat.agg[,c(1,i), with = F], pch = ".")

enter image description here