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 | 深挖一門語言的必要性
|