分享

R语言进阶笔记2 | 长数据与ggplot2

 育种数据分析 2021-11-18

1. 长数据是什么鬼?

之前介绍了如何将多个性状的箱线图放在一个图上,比如learnasreml包中的fm数据,它有h1~h5五年的株高数据,想对它进行作图。

「数据预览:」

> library(learnasreml)
> data(fm)
> head(fm)
  TreeID Spacing Rep   Fam Plot    dj    dm    wd h1  h2  h3  h4  h5
1  80001       3   1 70048    1 0.334 0.405 0.358 29 130 239 420 630
2  80002       3   1 70048    2 0.348 0.393 0.365 24 107 242 410 600
3  80004       3   1 70048    4 0.354 0.429 0.379 19  82 180 300 500
4  80005       3   1 70017    1 0.335 0.408 0.363 46 168 301 510 700
5  80008       3   1 70017    4 0.322 0.372 0.332 33 135 271 470 670
6  80026       3   1 70002    2 0.359 0.450 0.392 30 132 258 390 570

这里,相对h1,h2,h3,h4,h5这五个性状进行作图,我们可以将其转化为「长数据」

问题来了,什么是「长数据」,什么是「宽数据」(不是短数据,这不是反义词,谢谢)

「宽数据:」

即变量是多列数据,每一列都是一个值,比如株高数据,第一年的株高是一列,第二年的株高是一列,第三年的株高是一列,这些数据就是宽数据。

ID2018height2019height2020heightt
ID001121418
ID002111419
ID003141516

「长数据:」

即变量是,数据都在一列,比如株高数据,第一列是ID,第二列是年份,第三列是株高,这种数据叫长数据。

ID年份株高
ID001201812
ID001201914
ID001202018
ID002201811
ID002201914
ID002202019
ID003201814
ID003201915
ID003202016

「tidyverse」系列包,喜欢长数据,无论是清洗数据,还是汇总统计,还是ggplot2可视化,都喜欢长数据。

飞哥注:我今天明白了这个道理,即tidyverse系列喜欢长数据,感觉打开了任督二脉,对于数据处理又有了新的理解。

2. 怎么转化为长数据

我知道三种方法:

  • reshape2的melt函数,现在还知道这个包的人,R龄应该在5年以上了,反正我一直都用,很好用,但是被作者嫌弃了,现在被很多人嫌弃了……
  • data.tablemetlt函数,和reshape2包的函数同名,用法也相似,可以对DT数据处理,很快。现在我用melt函数时,就不用载入reshape2了,直接用data.table包就行
  • tidyverse中的tidyr中的pivot_longer函数,这个更简单,用过这个函数,再也没有迷路过。因为melt函数语法比较复杂,经常需要查看帮助文档或者以前的笔记。

看一下最简单的方法吧,看一下数据:

> dd = fm[,c(1,9:13)]
> head(dd)
  TreeID h1  h2  h3  h4  h5
1  80001 29 130 239 420 630
2  80002 24 107 242 410 600
3  80004 19  82 180 300 500
4  80005 46 168 301 510 700
5  80008 33 135 271 470 670
6  80026 30 132 258 390 570

然后用pivot_longer函数,将其转化为长数据:

> re = dd %>% pivot_longer(.,-1,names_to = "Year",values_to = "Height"
> head(re)
# A tibble: 6 x 3
  TreeID Year  Height
  <fct>  <chr>  <int>
1 80001  h1        29
2 80001  h2       130
3 80001  h3       239
4 80001  h4       420
5 80001  h5       630
6 80002  h1        24

代码解释:

  • 我用了管道符%/%,将数据传递给pivot_longer
  • 第二个-1,意思是除了第一个不处理,其它都处理,也可以用2:6表示第二到第六列处理
  • 第三个names_to是变量的名称,这里定义为Year
  • 第四个values_to是保存的性状名,这里是Height

可以看到,长数据有3列,分别是:

  • TreeID
  • Year
  • Height

3. ggplot2作图怎么搞

之前我使用ggplot2作图时,想做什么图,就在网上copy代码,然后根据自己的数据名称,修改代码,然后运行代码。一次性代码,用过就忘,半吊子水平,一直很稳定。

当我知道了ggplot2用长数据之后,又是另一种理解:

library(ggplot2)
re %>% ggplot(.,aes(x = Year, y = Height, colour = Year)) + geom_boxplot()

先看图片:

成功了,图片比较满意,第一个是h1的株高,第二个是h2的株高,依次类推。但是代码是什么意思呢?

我看了ggplot2的入门,画图分为三个部分:

  • 数据在哪里:re是数据
  • x轴,y轴在哪里:x轴是Year,y轴是Height
  • 画什么类型的图:这里是箱线图,所以是geom_boxplot

「如果是画分组散点图:」

re %>% ggplot(.,aes(x = Year, y = Height, colour = Year)) + geom_point()

「如果是画分组分散的散点图:」

re %>% ggplot(.,aes(x = Year, y = Height, colour = Year)) + geom_jitter()

4. 所以散点图和箱线图结合呢?

直接用+连接就行了,感觉到了画家作图的快乐,算是丫丫学徒吧,哈哈

re %>% ggplot(.,aes(x = Year, y = Height, colour = Year)) +  geom_jitter() + geom_boxplot()

5. 感受

所以,这就是学习的快乐了!

R语言进阶笔记1 | 深挖一门语言的必要性

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多