- 已编辑
链接:https://github.com/CubicZebra/VBTree
给某个Project写自动作图的程序的时候顺便写出来数据提取的section,之后发现这套数据管理逻辑挺实用的,就单独把这部分代码分离出来写了个包。vignettes写得特别粗糙不看也罢,有时间我再重写一份。??
很多数据集导入的汇总表具备各变量,如果大致分类的话可以分为numeric和non-numeric两种。比如标准数据集iris
,可以看出Sepal和Petal以及species是non-numeric的而Width和Length是numeric的。如果需要对某一种花的Sepal或Petal作长-宽散点图,在变量较少时,可以通直接查询数据,在plot函数里写入正确的x与y值。但假设这个数据集被扩充了,包含了花的产地,颜色等诸多信息导致数据具有成百上千列,这种情况下再用这种方法做图就几乎不可能了。
VBTree的想法是,将所有涉及到的变量写成结构化的列名,然后再通过列名对数据加以管理。还是以iris
为例,运行下列代码(iris和iris3只是数据存储方式不同,内容信息一样,这里用iris3转换):
data <- as.data.frame(iris3)
names(data) <- mapply(gsub, colnames(data), pattern=" |\\.{2}", replacement="-")
head(data)
dim(data)
将Species属性直接写入列名就成了VBTree可读的数据结构,可以看出原数据集从150乘05的dataframe变为50乘12的dataframe,凭空就少了三列的规模。这种数据压缩的效果在non-numeric的变量越多时,效果越明显。
看到VBTree可读的数据结构不少人可能会犯嘀咕,列数不降反增,那数据的预处理岂不是更麻烦了?其实不然,VBTree的想法是不需要对这样的数据进行任何的reshape操作(相信不少ggplot2 user都经历过这个阶段),通过把数据的列名打散并写入vector binary tree,double list,并还原为tensor或array从而实现数据的组操作。正如刚才的例子,如果根据自定义的组作长宽散点图,将VBTree的数据结构写入你的代码中,就可以对数据的子集实现动态的提取。新的vignettes将以自己编写的groupscatter函数为例(特殊原因这里暂不公开代码),仅通过运行groupscatter(data, c(2,2,1), 3, mfrow=c(1,2)),groupscatter(data, c(2,1,2), 1, mfrow=c(1,3))和groupscatter(data, c(2,2,1), c(1,3), mfrow=c(1,1)),就可以分别实现对不同的分组进行自动作图。而且这些图都是用的同一个函数生成,也就是说这是一种动态的编程实现,变量数目或者因子数等并没有在程序里被写死,不管你处理的数据涉及多少的变量(包括上面提到的,假想包含花的产地,颜色等属性的扩充数据集),也不管你怎么自定义数据的分组,长宽图都能够通过同一个函数来实现,这个功能以传统的dataframe为基础来实现的话是很难以想像的。
groupscatter自动作图的结果如下:
图显示不出来戳这里:https://github.com/CubicZebra/VBTree/blob/master/vignettes/Figs/groupscatter.png
以上~ 希望可以给大家的数据处理带来帮助。