r - 检查和可视化大型数据框中的间隙/空白和结构

标签 r visualization

我有一个大的数据框(400000 x 50),我想在外观上检查结构和毛坯/间隙。

是否有现有的库或ggplot2函数,可以吐出这样的图片:

红色可能是“日期”,蓝色可能是“因素”,绿色可能是“字符”,黑色可能是空白/NA。

最佳答案

您是否尝试过dfviewr中的lasagnar?下面的代码重现了包中50行x 10列df.in的所需图形:

library(devtools)
install_github("swihart/lasagnar")
library(lasagnar)   
dfviewr(df=df.in)
## also try:
##dfviewr(df=df.in, legend=FALSE)
##dfviewr(df=df.in, gridlines=FALSE)

因此,公平地说,在提出问题时dfviewr不存在,但是要了解导致其发展的一些想法以及如何实际可视化40万行,请在最底部看到for循环,然后不必太笨拙,并在df2.in(400,000 x 50)上运行该函数:
## Do not run:
## system.time(dfviewr(df=df2.in, gridlines=FALSE)) ## 10 minutes before useRaster=TRUE                                          
                                                    ##  2 minutes after

另外,tabplot:::tableplot()似乎不支持日期或字符:
library(tabplot)
tableplot(df.in)

产生:
Error in ff(initdata = initdata, length = length, levels = levels, ordered = ordered, : vmode 'character' not implemented
因此我们消除了字符列(#9):
tableplot(df.in[,c(-9)])

产生:
Error in UseMethod("as.hi") : no applicable method for 'as.hi' applied to an object of class "c('POSIXct', 'POSIXt')"
因此我们也消除了第一列(日期):
tableplot(df.in[,c(-1,-9)])

并得到

对于没有日期或字符列的400,000 x 50 df2.in,图像渲染速度非常快(6秒):
system.time(tableplot(df2.in[,c(-(1+seq(0,40,10)), -(9+seq(0,40,10))) ]))

对于有兴趣的读者...

我首先在50行上展示一个婴儿的例子,然后在40万行上展示一个例子。

对于它的值(value),我赞同@cmbarbu的评论,即在视觉上查看同一绘图上的40万行,该行受屏幕最多限制为2K像素的屏幕的限制,因此在某些情况下跨页拆分可能有益于防止过度绘图。我尝试通过创建一个PDF文档,以1000幅图/页显示400行的方式来实现这一突破。

我不知道一个函数将使用data.frame作为输入来呈现请求的图。我的方法将制作data.frame的矩阵掩码,然后使用 lasagna() package on github中的lasagnarlasagna()是函数image( t(X)[, (nrow(X):1)] )的包装,其中X是矩阵。此调用对行进行重新排序,以便它们与data.frame的顺序匹配,并且包装器允许切换网格线并添加图例(legend = TRUE将调用image.plot( t(X)[, (nrow(X):1)] );但是,在下面的示例中,我明确添加了图例不使用image.plot())。

任务库
library(fields)
library(colorspace)  
library(lubridate)
library(devtools)
install_github("swihart/lasagnar")
library(lasagnar)   

创建一个50行的示例数据帧(400K示例之前的婴儿示例)
df.in <- data.frame(date=seq(ymd('2012-04-07'),ymd('2013-03-22'), 
                    by = '1 week'),
           col1=rnorm(50),
           col2=rnorm(50),
           col3=rnorm(50),
           col4=rnorm(50),
           col5=as.factor(c("A","B")),
           col6=as.factor(c("MS","PHD")),
           col7=rnorm(50),
           col8=(c("cherlene","randy")),
           col9=rnorm(50),
           stringsAsFactors=FALSE)

导致失踪
df.in[19:23  , 2:4  ] <- NA
df.in[c(7, 9),      ] <- NA
df.in[2:30   , 4    ] <- NA
df.in[10     , 7    ] <- NA
df.in[14     , 6:10 ] <- NA

检查结构
str(df.in)

准备 mask 矩阵
mat.out <- matrix(NA, nrow=nrow(df.in), ncol=ncol(df.in))

然后循环浏览类型的列;在末尾应用is.na()
## red for dates
mat.out[,sapply(df.in,is.POSIXct)] <- 1
## blue for factors
mat.out[,sapply(df.in,is.factor)] <- 2
## green for characters
mat.out[,sapply(df.in,is.character)] <- 3
## white for numeric
mat.out[,sapply(df.in,is.numeric)] <- 4
## black for NA
mat.out[is.na(df.in)] <- 5

行名称可能适合追溯到原始数据
row.names(mat.out) <- 1:nrow(df.in)

渲染{烤宽面条(X)是图像的包装器(t(X)[,(nrow(X):1)])}}
lasagna(mat.out, col=c("red","blue","green","white","black"), 
        cex=0.67, main="")

传说是可能的:
lasagna(mat.out, col=c("red","blue","green","white","black"), 
        cex=.67, main="")
legend("bottom", fill=c("red","blue","green","white","black"),
        legend=c("dates", "factors", "characters", "numeric", "NA"), 
        horiz=T, xpd=NA, inset=c(-.15), border="black")

用gridlines = FALSE关闭网格线
lasagna(mat.out, col=c("red","blue","green","white","black"), 
        cex=.67, main="", gridlines=FALSE)
legend("bottom", fill=c("red","blue","green","white","black"),
        legend=c("dates", "factors", "characters", "numeric", "NA"), 
        horiz=T, xpd=NA, inset=c(-.15), border="black")

让我们以OP数据大小为例:400,000行x 50列

创建一个样本数据框
df2.10 <- data.frame(date=seq(ymd('2012-04-07'),ymd('2013-03-22'), 
                    by = '1 week'),
           col1=rnorm(400000),
           col2=rnorm(400000),
           col3=rnorm(400000),
           col4=rnorm(400000),
           col5=as.factor(c("A","B")),
           col6=as.factor(c("MS","PHD")),
           col7=rnorm(400000),
           col8=(c("cherlene","randy")),
           col9=rnorm(400000),
           stringsAsFactors=FALSE)

导致失踪
df2.10[c(19:23), c(2:4)  ] <- NA
df2.10[c(7,  9),         ] <- NA
df2.10[c(2:30), 4        ] <- NA
df2.10[10     , 7        ] <- NA
df2.10[14     , c(6:10)  ] <- NA    
df2.10[c(450:750), ] <- NA
df2.10[c(399990:399999), ] <- NA

合并为50列宽的df;检查结构
df2.in <- cbind(df2.10, df2.10, df2.10, df2.10, df2.10)
str(df2.in)

准备 mask 矩阵
mat.out <- matrix(NA, nrow=nrow(df2.in), ncol=ncol(df2.in))

然后循环浏览类型的列;在末尾应用is.na()
## red for dates
mat.out[,sapply(df2.in,is.POSIXct)] <- 1
## blue for factors
mat.out[,sapply(df2.in,is.factor)] <- 2
## green for characters
mat.out[,sapply(df2.in,is.character)] <- 3
## white for numeric
mat.out[,sapply(df2.in,is.numeric)] <- 4
## black for NA
mat.out[is.na(df2.in)] <- 5

行名称可能适合追溯到原始数据
row.names(mat.out) <- 1:nrow(df2.in)

渲染{lasagna_plain(X)没有网格线或行名}
pdf("pages1000.pdf")
  system.time(
    for(i in 1:1000){
        lasagna_plain(mat.out[((i-1)*400+1):(400*i),],
                      col=c("red","blue","green","white","black"), cex=1, 
                      main=paste0("rows: ", (i-1)*400+1,  " - ",  (400*i)))
    }
  )
dev.off()

for循环在我的机器上完成了40秒钟,而PDF在此之后不久就完成了。现在,在PDF查看器中标准化页面大小后,只需向下翻页,即可查看诸如此类的页面/图形:

关于r - 检查和可视化大型数据框中的间隙/空白和结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28813057/

相关文章:

r - 分层数据框导致 R 中的零行/观察

r - 执行两个向量的 'cross product',但有加法

r - writeRaster 输出文件大小

url - 谷歌图表显示问题

r - 根据按组增加的值推进观察

javascript - 如何将 D3 数据插值/动画函数应用于动态变化的饼图

linked-list - 从节点内开始一条边

javascript - 删除 D3 y 轴上的空白空间

javascript - 列的正/负部分的不同颜色

r - 将数字向量转换为标准单位向量的函数