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这五个性状进行作图,我们可以将其转化为「长数据」!
问题来了,什么是「长数据」,什么是「宽数据」(不是短数据,这不是反义词,谢谢)
「宽数据:」
❝即变量是多列数据,每一列都是一个值,比如株高数据,第一年的株高是一列,第二年的株高是一列,第三年的株高是一列,这些数据就是宽数据。
❞
ID | 2018height | 2019height | 2020heightt |
---|---|---|---|
ID001 | 12 | 14 | 18 |
ID002 | 11 | 14 | 19 |
ID003 | 14 | 15 | 16 |
「长数据:」
❝即变量是,数据都在一列,比如株高数据,第一列是ID,第二列是年份,第三列是株高,这种数据叫长数据。
❞
ID | 年份 | 株高 |
---|---|---|
ID001 | 2018 | 12 |
ID001 | 2019 | 14 |
ID001 | 2020 | 18 |
ID002 | 2018 | 11 |
ID002 | 2019 | 14 |
ID002 | 2020 | 19 |
ID003 | 2018 | 14 |
ID003 | 2019 | 15 |
ID003 | 2020 | 16 |
「tidyverse」系列包,喜欢长数据,无论是清洗数据,还是汇总统计,还是ggplot2可视化,都喜欢长数据。
❝飞哥注:我今天明白了这个道理,即tidyverse系列喜欢长数据,感觉打开了任督二脉,对于数据处理又有了新的理解。
❞
2. 怎么转化为长数据
我知道三种方法:
reshape
2的melt
函数,现在还知道这个包的人,R龄应该在5年以上了,反正我一直都用,很好用,但是被作者嫌弃了,现在被很多人嫌弃了……data.table
的metlt
函数,和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
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 | 深挖一门语言的必要性