用於數據視覺化和分析的有用的新 R 包

以下內容來自我在最近的電腦輔助報告會議上主持的實務會議。

由於新的 R 開發包稱為 R 包,現在有許多關於 R 包的活動正在進行html小工具,使人們可以輕鬆地為現有 JavaScript 庫編寫 R 包裝器。

我希望我們示範的第一個 html-widget-inspired 套件是

R 傳單

如果您不熟悉 Leaflet,它是一個 JavaScript 映射套件。 要安裝它,您需要使用 devtools 套件並從 GitHub 取得它(如果您的系統上尚未安裝 devtools,請使用 install.packages(“devtools”) 下載並安裝它。

devtools::install_github("rstudio/leaflet")

載入庫

library("leaflet")

第 1 步:建立基本地圖物件並新增圖塊

mymap <- leaflet()
mymap <- addTiles(mymap)

透過輸入物件名稱查看空地圖:

mymap

步驟 2:設定地圖的中心位置及其縮放級別

mymap <- setView(mymap, -84.3847, 33.7613, zoom = 17)
mymap

添加彈出視窗

addPopups(-84.3847, 33.7616, 'Data journalists at work, NICAR 2015')

現在我想向您介紹 R 中的一個新的連結函數:%>%

這會取得函數的結果並將其傳送到下一個函數,因此您不必不斷重複您儲存的變數名稱,類似於單字元 Unix 管道命令。 我們可以將上面的程式碼壓縮為:

mymap <- leaflet() %>% 
  addTiles() %>%
  setView(-84.3847, 33.7613, zoom = 17) %>%
  addPopups(-84.3847, 33.7616, 'Data journalists at work, NICAR 2015')

查看成品:

mymap

或者,如果您暫時不想將結果儲存在變數中,而只是互動工作:

leaflet() %>% 
  addTiles() %>%
  setView(-84.3847, 33.7613, zoom = 16) %>%
  addPopups(-84.3847, 33.7616, 'Data journalists at work, NICAR 2015')

現在讓我們做一些更有趣的事情 - 繪製附近星巴克地點的地圖。 載入 starbucks.csv 資料集 – 請參閱資料來源:https://opendata.socrata.com/Business/All-Starbucks-Locations-in-the-US-Map/ddym-zvjk

這些練習的數據檔案可以在我的網站上找到GitHub 上的 NICAR15 資料儲存庫。 您也可以使用 R 語言直接從 Socrata 的 OpenData 網站下載星巴克資料文件

download.file("https://opendata.socrata.com/api/views/ddym-zvjk/rows.csv?accessType=DOWNLOAD", destfile="starbucks.csv", method="curl")
starbucks <- read.csv("https://opendata.socrata.com/api/views/ddym-zvjk/rows.csv?accessType=DOWNLOAD", stringsAsFactors = FALSE)
str(starbucks)
atlanta <- subset(starbucks, City == "Atlanta" & State == "GA")
leaflet() %>% addTiles() %>% setView(-84.3847, 33.7613, zoom = 16) %>%
  addMarkers(data = atlanta, lat = ~ Latitude, lng = ~ Longitude,popup = atlanta$Name) %>%
  addPopups(-84.3847, 33.7616, 'Data journalists at work, NICAR 2015')

TCU 教授創建的腳本可讓您使用一行程式碼建立世界銀行資料的分區統計圖! 更多資訊請點這裡:

https://rpubs.com/walkerke/wdi_leaflet

statepops <- read.csv("acs2013_1yr_statepop.csv", stringsAsFactors = FALSE)
# A little glimpse at the dplyr library; lots more on that soon
library(dplyr)

有一個非常簡單的方法可以使用 dplyr 的計數函數格式按州對星巴克進行計數:count(mydataframe, mycolumnname)

starbucks_by_state <- count(starbucks, State)

我們需要在這裡添加州人口。 您可以使用基本 R 的 merge 或 dplyr 的 left_join 來做到這一點。 left_join 更快,但我發現合併更直觀

starbucks_by_state <- merge(starbucks_by_state, statepops, all.x = TRUE, by.x="State", by.y="State") # No need to do by.x and by.y if columns have the same name

# better names

names(starbucks_by_state) <- c("State", "NumberStarbucks", "StatePopulation")

使用 dplyr mutate 函數向 starbucks_by_state 新增列,這僅表示透過新增一列或多列來變更資料框。 然後我們將儲存在一個新的資料幀 starbucks_data 中,以免與原始資料框過多。

starbucks_data <- starbucks_by_state %>%

  mutate(
    PeoplePerStarbucks = round(StatePopulation / NumberStarbucks)
    ) %>%
  select(State, NumberStarbucks, PeoplePerStarbucks) %>%
  arrange(desc(PeoplePerStarbucks))

再次使用 %>% 字符,因此我們不必繼續寫類似的內容

starbucks_data <- mutate(starbucks_by_state, PeoplePerStarbucks = round(StatePopulation / NumberStarbucks))
starbucks_data <- select(starbucks_data, State, NumberStarbucks, PeoplePerStarbucks)
starbucks_data <- arrange(starbucks_data, desc(PeoplePerStarbucks))

我們可以假裝一下,對這些數據做直方圖是有意義的:-)嗎? 因為我想向您展示 Hadley Wickham 的 ggvis 包中一個很酷的新直方圖工具,該工具仍在開發中:

library(ggvis)
starbucks_data %>%
  ggvis(x = ~PeoplePerStarbucks, fill := "gray") %>%
  layer_histograms()

沒什麼大不了的? 有互動式滑桿的怎麼樣?

starbucks_data %>%
  ggvis(x = ~PeoplePerStarbucks, fill := "gray") %>%
  layer_histograms(width =  input_slider(1000, 20000, step = 1000, label = "width")) 

# Can even add a rollover tooltip

starbucks_data %>%
  ggvis(x = ~PeoplePerStarbucks, fill := "gray") %>%
  layer_histograms(width =  input_slider(1000, 20000, step = 1000, label = "width")) %>%
  add_tooltip(function(df) (df$stack_upr_ - df$stack_lwr_))

時間序列圖

載入所需的函式庫:dygraphs 和 xts 如果您的系統上尚未安裝,請先安裝

install.packages("dygraphs")
install.packages("xts")

首先,讓我們使用 R 中已包含的範例資料集運行一些演示程式碼,1974 年至 1979 年英國每月男性和女性因肺部疾病死亡的資料集是 mdeaths 和 fdeaths

首先,我們將使用 cbind()(按列組合)函數從這兩個物件建立一個物件。

library("dygraphs")
library("xts")
lungDeaths <- cbind(mdeaths, fdeaths)

# And now here's how easy it is to create an interactive multi-series graph:

dygraph(lungDeaths)

dygraphs 最「複雜」的一點是,它專門用於時間序列繪圖,並且需要一個時間序列物件。 您可以使用基本 R ts() 函數建立一個

ts(資料因子,每年測量頻率,開始日期為 c(年,月))

讀取有關亞特蘭大失業率的數據文件

atl_un <- read.csv("FRED-ATLA-unemployment.csv", stringsAsFactors = FALSE)
# now we need to convert this into a time series
atl_ts <- ts(data=atl_un$Unemployment, frequency = 12, start = c(1990, 1))
dygraph((atl_ts), main="Monthly Atlanta Unemployment Rate")

有關圖文的更多資訊:https://rstudio.github.io/dygraphs

注意:有一個名為 quantmod 的現有軟體包,可以為您提取大量金融和經濟數據並將其轉換為 xts 格式。 它從聖路易斯聯邦儲備銀行獲取數據。 我在他們的網站上搜索,發現亞特蘭大失業的網址是

https://research.stlouisfed.org/fred2/series/ATLA013URN

這意味著代碼是 ATLA013URN

library("quantmod")

這個命令

getSymbols("ATLA013URN", src="FRED")

自動將資料以正確的時間序列格式提取到 R 中,並將其儲存在與符號同名的變數中,在本例中為 ATLA013URN。 然後我們可以使用dygraph:

dygraph(ATLA013URN, main="Atlanta Unemployment")

若要變更 ATLA013URN 時間序列中資料列的名稱:

names(ATLA013URN) <- "rate"

現在重新繪製圖表:

dygraph(ATLA013URN, main="Atlanta Unemployment")

旁白:如果您只是在探索,Quantmod 有自己的資料視覺化:

chartSeries(ATLA013URN, subset="last 10 years")

另一個非常新的軟體包可讓您對聖路易斯聯邦儲備銀行的 FRED 資料進行更多探索; 您需要來自聯準會網站的免費 API 金鑰。 更多資訊請點這裡

https://github.com/jcizel/FredR

還有另一個新套件 rbokeh,實作了 R 版本的 Python bokeh 互動式 Web 繪圖庫。 我將跳過這一點,因為還有很多其他內容要討論,但希望您了解這一點。 它仍在開發中,並已在以下位置有詳細記錄

https://hafen.github.io/rbokeh/rd.html

另一種受 htmlwidgets 啟發的包:

library(DT)
datatable(atl_un)

現在我們已經享受了一些養眼的東西,我想把今天剩下的時間花在 dplyr 上,這是 Hadley Wickham 開發的一個相對較新的軟體包。 Hadley 是許多流行 R 軟體包的作者,其中包括 ggplot2 視覺化庫。

dplyr 的目標是提供相當簡單、合理的資料操作。 他談到了操作資料時需要做的 5 件基本、核心的事情:

若要依 1 個或多個條件僅選擇某些觀測值或行:filter()

僅選擇某些變數或欄位: select()

排序:排列()

新增列:mutate()

依子群組進行總結或分析:group_by() 和 summarise()

依子組對資料套用函數:group_by() 和 do()

還有其他有用的函數,例如群組中前 n 個項目的排名函數 top_n()、min_rank() 和 dendense_rank()、lead() 和 lag()。

dplyr 會建立一個名為 tbl_df 的資料框類,其行為很大程度上類似於資料框,但具有一些方便的功能,例如,如果您鍵入其名稱,則不會意外列印數百行。

Hadley 有一個名為 nycflights13 的範例資料包,用於學習 dplyr,但讓我們看看是否可以載入進出喬治亞機場的國內航班的 CSV 檔案。

請注意,當我下載此文件時,只有 2014 年 1 月到 11 月的可用資料。

library(dplyr)
ga <- read.csv("GAontime.csv", stringsAsFactors = FALSE, header = TRUE)

注意:read.csv 可能需要一段時間才能處理大型資料檔案。 匆忙?

使用 data.table 套件的 fread 函數。 data.table 有自己的物件類別和自己的功能生態系。 如果您不打算使用這些(我不),只需將對象轉換回資料框或 dplyr tbl_df 對象

ga <- data.table::fread("GAontime.csv")
# We can turn this into a dplyr class tbl_df object with
ga <- tbl_df(ga)
# Now see what happens if you just type the variable name
ga
# We'll look at the structure:
str(ga)
# There's also a dplyr-specific function glimpse() with a slightly better format
glimpse(ga)
# Let's just get Hartfield data. We want to filter for either ORIGIN or DEST being Hartsfield with code ATL
atlanta <- filter(ga, ORIGIN == "ATL" | DEST == "ATL")

現在我們可以用這些數據回答各種各樣的問題

飛往特定地點的航班平均延誤時間、中位數延誤時間和最長延誤時間是多少按承運人? 如果是國內航班,請隨意選擇您從亞特蘭大飛往的機場,我將使用波士頓的洛根機場

bosdelays1 <- atlanta %>%
  filter(DEST == "BOS") %>%
  group_by(CARRIER) %>%
  summarise(
    avgdelay = mean(DEP_DELAY, na.rm = TRUE),
    mediandelay = median(DEP_DELAY, na.rm = TRUE),
    maxdelay = max(DEP_DELAY, na.rm = TRUE)
    )

bosdelays1

# Or just the average delay by airline to Boston? 

avg_delays <- atlanta %>%
  filter(DEST == "BOS") %>%
  group_by(CARRIER) %>%
  summarise(avgdelay = mean(DEP_DELAY, na.rm=TRUE))

avg_delays

# What's the average delay by airline for each month to a specific destination? 

avg_delays_by_month <- atlanta %>%
  filter(DEST == "BOS") %>%
  group_by(CARRIER, MONTH) %>%
  summarise(avgdelay = round(mean(DEP_DELAY, na.rm=TRUE),1))

avg_delays_by_month

# Not as easy to see those, let's make a datatable:

datatable(avg_delays_by_month)

想念 Excel 資料透視表嗎? 您也可以在 R 中完成它們!

首先讓我們取得我們想要的資料的子集

bos_delays <- subset(atlanta, DEST=="BOS", select=c("CARRIER", "DEP_DELAY", "MONTH"))
library("rpivotTable")
rpivotTable(bos_delays)

讓我們從下拉清單中選擇 Average,然後選擇 DEP_DELAY。 想查看每個月的平均延誤情況嗎? 將月份拖曳至列標題。 想要更多視覺效果嗎? 按列選擇熱圖

但回到「常規」R…

每家航空公司延誤時間最長的前 5 名是哪幾家?

delays <- atlanta %>%
  select(CARRIER, DEP_DELAY, DEST, FL_NUM, FL_DATE) %>%    # columns I want
  group_by(CARRIER) %>%
  top_n(5, DEP_DELAY) %>%
  arrange(CARRIER, desc(DEP_DELAY))

View(delays)

# Which are the unlucky destinations in those top 5?

table(delays$DEST)

# What were the top 5 longest  delays per destination?

delays2 <- atlanta %>%
  select(CARRIER, DEP_DELAY, DEST, FL_NUM, FL_DATE) %>%    # columns I want
  group_by(DEST) %>%
  top_n(5, DEP_DELAY) %>%
  arrange(CARRIER, desc(DEP_DELAY))

View(delays2)

# Can do basics such as percentage delayed flights by airline
# Can use either subset or the true dplyr-way below

atlanta_delays1 <- subset(atlanta, select=c("CARRIER", "DEP_DEL15")) %>%  
  group_by(CARRIER) %>%
  summarize(
    Percent = sum(DEP_DEL15, na.rm = TRUE) / n()
    )

atlanta_delays2 <- atlanta %>%
  group_by(CARRIER) %>%
    summarize(
    Delays = sum(DEP_DEL15, na.rm = TRUE),
    Total = n(),
    Percent = round((Delays / Total) * 100,1)
  ) %>%
  arrange(desc(Percent)) 

# and a basic bar chart of the percentages

library(ggplot2)
ggplot(data = atlanta_delays2, aes(x=CARRIER, y=Percent))  + geom_bar(stat="identity")

# If you want to order by Percent and not alphabetical. Plus add color and a title:

ggplot(data = atlanta_delays2, aes(x=reorder(CARRIER, Percent), y=Percent))  + geom_bar(stat="identity", fill="lightblue", color="black") + 
  xlab("Airline") + ggtitle("Percent delayed flights from Atlanta Jan-Nov 2014")

不是一個新包,但如果您不熟悉 GoogleVis 並且想查看程式碼 – 這會產生一個 HTML 頁面:

library("googleVis")
# get just the data we want - carrier and percent
 delay_subset <- subset(atlanta_delays2, select=c("CARRIER", "Percent"))
gchart <- gvisColumnChart(delay_subset, options = list())
plot(gchart)

是否有最常進出亞特蘭大的特定飛機?

by_plane <- count(atlanta, TAIL_NUM) %>%
  arrange(desc(n))

# what's the distribution?

by_plane %>%
  ggvis(x = ~n, fill := "gray") %>% 
  layer_histograms(width =  input_slider(10, 200, step = 10, label = "binwidth")) 

# How might delays be related to distances flown? Hadley shows this code:

by_tailnum <- group_by(atlanta, TAIL_NUM)
delay <- summarise(by_tailnum,
                   count = n(),
                   dist = mean(DISTANCE, na.rm = TRUE),
                   delay = mean(ARR_DELAY, na.rm = TRUE))
delay <- filter(delay, count > 20, dist 

哈德利也發現,紐約市數據中的飛行距離和延誤之間沒有太大相關性。

googleVis 庫可能不是新庫,但它有一些新選項。 讓我們來看看亞特蘭大的一些天氣數據:

atlwx <- read.csv("AtlantaTemps.csv", stringsAsFactors = FALSE)
atlwx$date <- as.Date(atlwx$date, format="%Y-%m-%d")

# Run this code and see what happens:

dataviz <- gvisCalendar(atlwx, datevar="date", numvar="max",
                  options=list(,
                               width = 1000, height = 8000))
plot(dataviz)

我們現在不會運行這個,因為每個人都需要一個plot.ly 帳戶和API 金鑰——兩者都是免費的。 但只需 2 行程式碼,您就可以將 ggplot 映像轉換為互動式 JavaScript 並嵌入它。

library("plotly")

# if you had a plot.ly API key installed:

myplotly <- plotly()
myplotly$ggplotly()

有關 R 的更多信息,請參閱我的 R 初學者指南:

PDF下載https://cwrld.us/LearnRpdfHTML 版本:https://cwrld.us/IntroToR

如果我們有更多時間,我希望我們可以使用其他軟體包:

rvest:Hadley Wickham 的 Easy Web 抓取套件。 有關將其與 Selectorgadget 書籤一起使用的分步說明:https://bit.ly/1zgq8JW

FredR:進一步探討聖路易斯聯邦儲備銀行的 FRED 資料; 您需要來自聯準會網站的免費 API 金鑰。https://github.com/jcizel/FredR

plot.ly:將靜態 ggplot2 圖形轉換為互動式 JavaScript 視覺化,輕鬆嵌入 Web 上。 需要免費的plot.ly 帳戶和API 金鑰。https://plot.ly/ggplot2/

rbokeh:實作 R 版本的 Python bokeh 互動式 Web 繪圖函式庫。 它仍在開發中,但已經有詳細記錄。https://hafen.github.io/rbokeh/rd.html

metricsgraphics:另一個有趣的圖形項目,連接到 MetricsGraphics.js D3 JavaScript 函式庫https://github.com/hrbrmstr/metricsgraphics

使用我們嘗試過的軟體包,我們可以用更多時間完成其他事情:

由 TCU 教授創建的腳本可讓您使用 Leaflet 一行程式碼建立世界銀行資料的分區統計圖! 更多資訊請點這裡:

https://rpubs.com/walkerke/wdi_leaflet

您可以使用 Leaflet 和 R 完成更複雜的 GIS 工作。

例如,在每個標記周圍繪製半徑為 2 公里的圓圈。 TCU 助理教授 Kyle Walker 的教程https://rpubs.com/walkerke/rstudio_gis

使用您自己的形狀檔案和資料建立分區統計圖的教程

https://rpubs.com/walkerke/leaflet_choropleth

有關 Leaflet 的更多信息,請訪問 Leaflet 專案頁面https://rstudio.github.io/leaflet/

你使用ggplot2視覺化套件嗎? 使用我們免費的 ggplot2 程式碼片段節省輸入和語法查找時間。