Datacamp是一個很棒的學習程式語言的網站!在這個網站中,可以學習R,Python等很火併且對於心理學專業很實用的編程技能!我買了一年的會員,目前趁著一直在家待著,沒事就學習一下,也就想到了在這分享一下學習的內容。現在覺得敲代碼還真是挺有意思的,至少可以看著繁雜的數據變得整齊、可視化,也覺得蠻有成就感。今天就是學習筆記的第一部分,TIDYVERSE!也推薦大家也可以用TIDYVERSE來對自己的實驗數據進行一下整理和可視化。給大家看一個實例,感受一下經過整理和可視化的數據。
目錄:
Data Wrangling
Data Visualization
Grouping and summarizing
Types of visualization
Data Wrangling(數據整理)
Tidyverse的第一個功能就是數據的整理,在這個功能中我們第一個用到的package就是dplyr,使用這個包,我們能夠對我們的數據進行一系列處理,例如filter(篩選),summarize(進行計算,例如平均值,中位數等)。Datacamp的實例使用的是gapminder,是一個描各個國家在不同年份的GDP、人口數量等數據,那我分享時也採用這個數據。
現在開始操作吧!先把需要的給加載起來!
1# 載入gapminder數據
2library(gapminder)
3
4# 載入dplyr包
5library(dplyr)
6
7# 查看gapminder
8gapminder
現在數據和包都加加載好了,看一下gapminder長啥樣!
1704行的數據,還是很龐大的,所以我們要做的就是一步步的梳理數據,然後看到我們想看到的部分。如果我們想要對這些數據進行操作,那我們要用到dplyr中的verbs,第一個就是filter,它可以幫助我們篩選數據,例如我們篩選所有2007年的數據。在這裡shouxian 需要注意的是,我們用到了%>%這個符號,它在R中的意思是管道,類似於流水線上的工人,在確認了上一步的操作後,做一個標記,然後進入下一步,因此每一步都要表上pipe。其次在filter中,我們使用了「==」而不是「=」,這個我們學院開設psychopy的時候講過兩者的區別,在這裡一定使用「==」,否則會報錯。
1library(gapminder)
2library(dplyr)
3
4# 篩選出2007年的數據
5gapminder %>%
6 filter(year == 2007) %>%
篩選出的數據如下,可以看到,year這一部分全部是2007,然後數據的行數變成了142行,這表明我們完成了對於year這一變量的篩選!想要篩選其他的變量,也是同樣滴操作。
filter還可以同時篩選多個變量,比如:
1library(gapminder)
2library(dplyr)
3
4# 篩選出2007年和亞洲的數據
5gapminder %>%
6 filter(year == 2007, continent = "Asia") %>%
第二個動詞是arrange,這個verb可以幫助我們對數據按照大小進行排序,在其中加入desc的話還可以按照從大到小的順序將數據排列。例如我們對gdpPercap進行排序
1gapminder %>%
2arrange(desc(gdpPercap))
效果就是這樣滴:
第三個verb是mutate,mutate可以對數據中的列進行更改或者增加列,可以用"* / + -"對變量進行計算,這裡我們展示如何增加列,和更改列是相似的操作。
1gapminder %>%
2mutate(gdp = gdpPercap * pop)
我們可以看到,在數據中,增加了gdp這一列,是我們通過計算得出來的,也可以使用mutate對數據進行更多的操作,自己探索吧!
當使用多個verb時,我們要在每一個動作後面加上pipe,也就是%>%,要不然會報錯的!正確示範如下圖:
1gapminder %>%
2mutate(gdp = gdpPercap * pop) %>%
3filter(year == 2007) %>%
4arrange(desc(gdp))
2. Data Visualization(數據可視化)
在這裡,我們加入了一個新的package——ggplot2!在這個介紹中,使用起來非常方便,只需要設置好使用的數據、x軸、y軸、圖表樣式等,就能給數據畫出好看的圖片(個人對於給數據畫圖還挺鍾愛的)。
1# 載入ggplot2包
2library(ggplot2)
3# 使用gapminder數據畫圖,x軸為gdpPercap,y軸為lifeExp,設置為散點圖
4ggplot(gapminder, aes(x = gdpPerCap, y = lifeExp)) + geom_point()
看看我們畫出來的圖:還是有點東西的嘿嘿。其中geom_point()是將圖設置為散點圖。
下面我們看一下如何將畫出來的散點圖上色,例如我們以continent的不同類別來區分散點:其中scale_x_log10()是將x軸的單位轉化為log10,雖然我也不知道為什麼哈哈。
1# 載入所需packages
2library(ggplot2)
3library(dplyr)
4library(gapminder)
5# 篩選出只包含2007年數據的數據集
6gaominder_2007 <- gapminder %>%
7 filter(year == 2007)
8# 使用gapminder數據畫圖,x軸為gdpPercap,y軸為lifeExp,設置為散點圖
9ggplot(gapminder_2007, aes(x = gdpPerCap, y = lifeExp, color = continent))
10+ geom_point()
11+ scale_x_log10()
畫出來的圖,就是帶上了鮮豔的顏色的圖片,非常的美觀,顏色的話是R自己設置的,不用我們自己設置嘿嘿。
我們還可以通過設置facet,來同時呈現多個圖片,這樣我們就可以根據continent的分類,把每一個continent的數據單獨呈現在表中。在這裡我們還添加了size這個選項,這樣設置,散點的大小會根據pop的大小變化,讓數據的大小更加直觀!(facet_wrap後面的~是by的意思)
1ggplot(gapminder, aes(x = gdpPercap, y = lifeExp, size = pop, color = continent))
2+ geom_point()
3+ scale_x_log10()
4# 設置facet,根據continent分解
5+ facet_wrap(~ year)
效果:
3. Grouping and Summarizing
這裡我們又引入一個新verb——summarize。顧名思義,這個verb可以幫助我們對數據進行一個總結,可以進行mean, sum, median, min, max的操作。用法如下:
1gapminder %>% filter(year == 2007) %>%
2summarize(meanLifeExp = mean(lifeExp),
3 totalPop = sum(pop))
這樣我們就總結出了兩個新的變量,meanLifeExp,是lifeExp的平均值,totalPop,是pop的和。
在summarize前使用group_by這個verb,可以把我們想整理的數據按照group_by的變量先行合併,比如:
1gapminder %>%
2# 根據year變量,將數據分組
3group_by(year) %>%
4summarize(meanLifeExp = mean(lifeExp),
5 totalPop = sum(pop))
這樣我們得出來的數據就不像剛才那樣是兩個數字了,而是根據年份下的一個列表!
下面我們可以嘗試用經過group和summarize後的數據,來進行visualization!
1# 創建一個by_year_continent數據集
2by_year_continent <- gapminder %>%
3group_by(year, continent) %>%
4summarize(totalPop = sum(pop), meanLifeExp = mean(lifeExp))
5# 使用ggplot2給by_year_continent畫個圖
6ggplot(by_year_continent, aes(x = year, y = totalPop, color = continent))
7+ geom_point()
8+ expand_limits(y = 0) # 將y軸起點設置為0
如圖所示:
4. Types of Visualization
使用ggplot2還可以畫出其他樣式的圖,包含線圖、柱狀圖、直方圖、箱圖,下面簡略的附上代碼和成圖。不同的圖,基本上後面就是改一下geom_後面的部分。
線圖:
1library(gapminder)
2library(dplyr)
3library(ggplot2)
4
5# 創建by_year這個數據集,根據不同年份計算gdpPercap的中位數並保存
6by_year <- gapminder %>%
7 group_by(year) %>%
8 summarize(medianGdpPercap = median(gdpPercap))
9
10# 畫一個gdpPercap隨年份變化的線圖
11ggplot(by_year, aes(x = year, y = medianGdpPercap))
12+ geom_line()
13+ expand_limits(y = 0)
效果圖:
柱狀圖:
1library(gapminder)
2library(dplyr)
3library(ggplot2)
4
5# 篩選出Ocieania洲的1952年數據
6oceania_1952 <- gapminder %>%
7 filter(continent == "Oceania", year == 1952)
8
9# 繪製柱狀圖
10ggplot(oceania_1952, aes(x = country, y = gdpPercap))
11+ geom_col()
效果圖:
直方圖:
1library(gapminder)
2library(dplyr)
3library(ggplot2)
4
5# 篩選出1952年的數據,並將pop的單位換算成百萬
6gapminder_1952 <- gapminder %>%
7 filter(year == 1952) %>%
8 mutate(pop_by_mil = pop / 1000000)
9
10# 用pop_by_mil繪製直方圖
11ggplot(gapminder_1952, aes(x = pop_by_mil)) +
12 geom_histogram(bins = 50)
效果圖:
最後一個box plot!
1gapminder_1952 <- gapminder %>%
2 filter(year == 1952)
3
4# 繪製box plot,比較1952年不同continent之間的gdpPercap
5ggplot(gapminder_1952, aes(x = continent, y = gdpPercap))
6+ geom_boxplot()
7+ scale_y_log10()
效果圖:
寫這麼多累死我了我靠!以後再更!!一起學習R嘿嘿
材料來源:www.datacamp.com