在R中绘制非常大的数据集

Dan*_*ndt 26 plot r large-data-volumes

如何在R中绘制一个非常大的数据集?

我想使用箱形图或小提琴图或类似的.所有数据都无法放入内存中.我可以逐步读入并计算制作这些图所需的摘要吗?如果是这样的话?

mbq*_*mbq 10

作为我对Dmitri回答的评论的补充,这是一个使用ff大数据处理包计算分位数的函数:

ffquantile<-function(ffv,qs=c(0,0.25,0.5,0.75,1),...){
 stopifnot(all(qs<=1 & qs>=0))
 ffsort(ffv,...)->ffvs
 j<-(qs*(length(ffv)-1))+1
 jf<-floor(j);ceiling(j)->jc
 rowSums(matrix(ffvs[c(jf,jc)],length(qs),2))/2
}
Run Code Online (Sandbox Code Playgroud)

这是一个精确的算法,因此它使用排序 - 因此可能需要很长时间.

  • 看起来你正试图在你的代码中实现某种<-...->对称性;) (2认同)

Jor*_*eys 8

问题是你无法将所有数据加载到内存中.所以你可以对数据进行抽样,如前面的@Marek所示.在如此庞大的数据集上,即使只占1%的数据,也可以得到基本相同的结果.对于小提琴情节,这将给你一个不错的密度估计.逐步计算分位数是不可能的,但这应该给出一个非常好的近似值.它基本上与@aix给出的链接中描述的"随机方法"相同.

如果您不能在R之外对日期进行子集化,则可以使用连接组合来完成sample().以下函数是我用来从文本格式的数据框中采样过大的函数.如果您对连接稍微玩一下,您可以轻松地将其转换为socketConnection或其他从服务器,数据库等中读取它.只需确保以正确的模式打开连接.

好,拿一个简单的.csv文件,然后跟随函数样本数据的一小部分:

sample.df <- function(f,n=10000,split=",",p=0.1){
    con <- file(f,open="rt",)
    on.exit(close(con,type="rt"))
    y <- data.frame()
    #read header
    x <- character(0)
    while(length(x)==0){
      x <- strsplit(readLines(con,n=1),split)[[1]]
    }
    Names <- x
    #read and process data
    repeat{
      x <- tryCatch(read.table(con,nrows=n,sep=split),error = function(e) NULL )
      if(is.null(x)) {break}
      names(x) <- Names
      nn <- nrow(x)
      id <- sample(1:nn,round(nn*p))
      y <- rbind(y,x[id,])
    }
    rownames(y) <- NULL
    return(y)
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

#Make a file
Df <- data.frame(
  X1=1:10000,
  X2=1:10000,
  X3=rep(letters[1:10],1000)
)
write.csv(Df,file="test.txt",row.names=F,quote=F)

# n is number of lines to be read at once, p is the fraction to sample
DF2 <- sample.df("test.txt",n=1000,p=0.2)
str(DF2)

#clean up
unlink("test.txt")
Run Code Online (Sandbox Code Playgroud)