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 <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列,分别是: 3. ggplot2作图怎么搞之前我使用ggplot2作图时,想做什么图,就在网上copy代码,然后根据自己的数据名称,修改代码,然后运行代码。一次性代码,用过就忘,半吊子水平,一直很稳定。 当我知道了ggplot2用长数据之后,又是另一种理解: library(ggplot2) re %>% ggplot(.,aes(x = Year, y = Height, colour = Year)) + geom_boxplot()
先看图片:  成功了,图片比较满意,第一个是h1的株高,第二个是h2的株高,依次类推。但是代码是什么意思呢? 我看了ggplot2的入门,画图分为三个部分: - 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 | 深挖一门语言的必要性
|