专栏名称: 朝阳35处
互联网金融大数据挖掘哪家强,平安前海征信帮你忙。分享数据挖掘和人工智能前沿技术,探讨其在风险控制、反欺诈等金融业务中的实际应用。每周涨点知识,多点谈资,定期举办行业沙龙。
目录
相关文章推荐
高校人才网V  ·  101个职位虚位以待!北京工业大学2025年 ... ·  昨天  
高校人才网V  ·  北京第二外国语学院2025年公开招聘公告 ·  2 天前  
51好读  ›  专栏  ›  朝阳35处

一款脑洞大开的表格可视化神器

朝阳35处  · 公众号  ·  · 2018-05-09 18:06

正文

作者 杜雨

今天跟大家介绍一款任坤大神写的新包——formattable。

这个包的功能很简单,但是却很具创意性,它颠覆了R语言data.frame数据表的呈现方式,允许在表格内自定义视觉化元素,比如对某一列数据进行字号、颜色、背景、以及图形化处理,整体的版式仍然保留表格的样式,但是已经具有了表和图结合的意味。

关于数据框的呈现方式,R语言内目前较好的自定义呈现方式是谢益辉大神的DT包,可以 将静态表格动态化,进行切片、索引、排序操作。

devtools::install_github("renkun-ken/formattable")
install.packages("formattable")
library("formattable")
library("DT")

自定义百分比显示格式。

接触过R语言的都知道R中没有数值形式的百分比,只有浮点型,如果要在数据框中自定义某一列为百分比,则需要使用文本拼接函数将其格式化,但是这样格式化之后,该列便会失去数值格式,转换为字符型变量,无法参数数学运算。

但是formattable包通过扩展内部运算逻辑,不仅可以非常方便的将某一浮点型列自定义为百分比,而且保留其数学运算属性。

p 0.1, 0.02, 0.03, 0.12))
p
[1] 10.00% 2.00%  3.00%  12.00%

p + 0.01[1] 11.00% 3.00%  4.00%  13.00%

max(p)
[1] 12.00%

mean(p)
[1] 6.75%

class(p)
[1] "formattable" "numeric"

通过查看其S3类发现,formattable格式继承了numeric属性,因而保留了数学运算能力。

balance 1000, 500, 200, -150, 0, 1200))
balance
[1] 1,000.00 500.00   200.00   (150.00) 0.00     1,200.00
balance + 1000

[1] 2,000.00 1,500.00 1,200.00 850.00   1,000.00 2,200.00

以上accounting函数可以将输出向量自定义为会计上使用的数字合适,三维间隔,同时负值加括号。

class(balance)

[1] "formattable" "numeric"

其核心实现方式仍然是通过将其底层S3类继承numeric来实现保留数学运算功能。

p 1, 2, 3, 4, 5), 
  name = c("A1", "A2", "B1", "B2", "C1"),
  balance = accounting(c(52500, 36150, 25000, 18300, 7600), format = "d"),
  growth = percent(c(0.3, 0.3, 0.1, 0.15, 0.15), format = "d"),
  ready = formattable(c(TRUE, TRUE, FALSE, FALSE, TRUE), "yes", "no"))
p

  id name balance growth ready
1  1   A1  52,500    30%   yes
2  2   A2  36,150    30%   yes
3  3   B1  25,000    10%    no
4  4   B2  18,300    15%    no
5  5   C1   7,600    15%   yes

在数据框中这些特性也依然能够保留(这是自然地,因为数据框就是由若干个等长的向量组成的)

但是这仅仅是formattable很基础的功能部分,下面给大家展示它的杀手锏——针对数据框表格的超强自定义可视化能力。

df 1:10,
  name = c("Bob", "Ashley", "James", "David", "Jenny", 
    "Hans", "Leo", "John", "Emily", "Lee"), 
  age = c(28, 27, 30, 28, 29, 29, 27, 27, 31, 30),
  grade = c("C", "A", "A", "C", "B", "B", "B", "A", "C", "C"),
  test1_score = c(8.9, 9.5, 9.6, 8.9, 9.1, 9.3, 9.3, 9.9, 8.5, 8.6),
  test2_score = c(9.1, 9.1, 9.2, 9.1, 8.9, 8.5, 9.2, 9.3, 9.1, 8.8),
  final_score = c(9, 9.3, 9.4, 9, 9, 8.9, 9.25, 9.6, 8.8, 8.7),
  registered = c(TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE),
  stringsAsFactors = FALSE)







请到「今天看啥」查看全文