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)
这是一个精确的算法,因此它使用排序 - 因此可能需要很长时间.
问题是你无法将所有数据加载到内存中.所以你可以对数据进行抽样,如前面的@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)