用 R 语言打个印咋就这么费事儿呢

270 阅读3分钟

1. 引子

前两天还说 R 语言不是不好,(只是不适合咱用)[],今天就想收回这话了。这货用着也太别扭了,一个最简单的可视化差点憋死我。

就像马保国,名气大,实则很完蛋。

2. 问题

比如一个最简单的csv,想打印成 Bar Plot。数据长的像下面这样

skills number
machine learning 7255
communication skill 2970
fast pace 1672
software develop 1356
track record 1079
deep learning 1065
project management 1047
natural language 958
data mining 939
written communication 926

再简单不过的一个表格,想按照上面顺序打印出来。于是导入以后调用 ggplot2 开始可视化

library(ggplot2)
sdata = read.csv('skills.csv')
ggplot(data=sdata) + geom_col(mapping = aes(x=skills, y=n)) +
    theme(axis.text.x = element_text(angle = 90)) + coord_flip()

但就这么简单个东西,问题就出来了,打印结果如下

不对吖,不应该是按照我数据的顺序打印么?这算怎么回事儿?仔细一看,丫的自作主张给我按照字母顺序排序打印了。

自作多情。谁稀罕你的排序啊。我就纳闷了,有多少次我们打印会按照字母顺序?直接按我原始数据指定的打印不好么?看 Python 多听话

import pandas as pd
import matplotlib.pyplot as plt

sdata = pd.read_csv("skills.csv", skipinitialspace=True)
plt.style.use('ggplot')
plt.barh(y=sdata.skills, width=sdata.numbers)
plt.xticks(rotation=90)
plt.gca().invert_yaxis()

结果

3. 分析

上网搜了一下,有的文章说是因为dataframe把categorical data转换成了factor,然后按照factor的order打印的。那我们把factor转换成vector是不是就可以了?

试试

sdata = read.csv('skills.csv')
sdata$skills = as.character(sdata$skills)
ggplot(data=sdata) + geom_col(mapping = aes(x=skills, y=numbers)) +
    theme(axis.text.x = element_text(angle = 90)) + coord_flip()

很遗憾,结果和之前一模一样

所以,应该是 R 在处理坐标轴排序的时候就是用的字母顺序,和factor还是vector没有关系。这个设计真是脑残。

既然想保持固定顺序,我们最后还是得回到能排序的东西上来。仔细看了看各种数据类型,也还是得靠facto。不管是它的 level属性,还是它的ordered属性,都是指定顺序的。指定level的时候,需要重新修改一下原来的column

sdata = read.csv('skills.csv')
s = as.character(sdata$skills)
sdata$skills = factor(s, levels = rev(s))
ggplot(data=sdata) + geom_col(mapping = aes(x=skills, y=numbers)) +
    theme(axis.text.x = element_text(angle = 90)) + coord_flip()

这回终于一切正常了

4. 总结

这两天用 R,各方面都很怪异。作为被Python惯坏的东哥,实在有点伺候不了这个性格怪异的家伙。

上网大致搜了一下,R 第一版发布于1993年,前驱的 S语言则发布于1976年,算是上古语言了。Python则发布于1990年,没有前驱语言;其计算包 NumPy 发布于1995年,分析包pandas发布于2008年。

这就是先发优势吧。虽然Python优雅简洁,奈何R语言已经在统计和科学计算方面有了统治级别的地位。想一时半会儿取而代之,还是颇有难度。尤其在学界。

但我是真有点受够她了。人生苦短,我为啥不用 Python。

5. 交流

独学而无友则孤陋寡闻。现有「数据与统计科学」微信交流群,内有数据行业资深从业人员、海外博士、硕士等,欢迎对数据科学、数据分析、机器学习、人工智能有兴趣的朋友加入,一起学习讨论。

大家可以扫描下面二维码,添加荔姐微信邀请加入,暗号:机器学习加群。

Lily
Lily

6. 扩展

6.1. 参考文献

  1. Dr. P. Prakash和A. S. K. Rao, R Data Structures and Algorithms. 2016.
  2. H. Wickham和G. Grolemund, R for data science: import, tidy, transform, visualize, and model data, First edition. Sebastopol, CA: O’Reilly, 2016.

Data2Science
Data2Science

本文使用 mdnice 排版