[R]使用ggplot2套件進行EXCEL資料分析繪製長條圖-以醫療機構與人員基本資料為例

案例情境:下載政府資料開放平台的「醫療機構與人員基本資料」,內為2019年全台灣醫療機構的清單,資料量約2萬2000多筆,用以模擬EXCEL的樞紐分析表,查出各縣市的醫療機構數量,並繪製成長條圖。

程式流程說明:

礙於網路流量限制,故先將醫療機構與人員基本資料下載至R專案中,如下圖。

  1. 使用read.csv()方法取得xls黨內的所有列資料:計算醫療機構地區數(22個縣市)→用來設計第一層for迴圈最大值用;計算總醫療機構數(2萬2千多筆資料)→用來設計第二層for迴圈最大值用
  2. 宣告資料矩陣,並在雙層迴圈中,用縣市來做總清單的比對(地址的前三個字串),並做數值累加,分別統計出各地區的醫療機構總數,加入矩陣中。
  3. 再將矩陣內容進行排序(醫療機構數由大至小排序)。
  4. 將排序後的矩陣轉換為資料框架,並使用ggplot()物件產生圖表。
require("gdata")
library("ggplot2")
#資料來源參考:https://data.gov.tw/dataset/15393
hospitals <- read.csv("xls/醫療機構與人員基本資料20190131.csv", encoding = "UTF-8-BOM", header = T)
hospitalCount <- length(hospitals$`機構代碼`)
region <- unique(substr(hospitals$`縣市鄉鎮`, 0, 3))
regionCount <- length(region)

counter <- 0
order_m <- matrix(NA, nrow = regionCount, ncol = 2)
column1Name <- "縣市地區"
column2Name <- "機構數"
colnames(order_m) = c(column1Name, column2Name)
for (x in 1:regionCount) {
    for (y in 1:hospitalCount) {
        if (region[x] == substr(hospitals$`縣市鄉鎮`[y], 0, 3)) {
            counter <- counter + 1
        }
    }
    order_m[[x, 1]] <- x
    order_m[[x, 2]] <- counter
    counter <- 0
}
#矩陣排序參考:https://www.displayr.com/how-to-sort-data-in-r/?utm_referrer=https%3A%2F%2Fwww.google.com.tw%2F
order_m <- order_m[order(order_m[,2], decreasing = TRUE),] #改變排序(由大至小)

regionMsg <- "各地區醫療機構數統計:\n"
for (z in 1:regionCount) {
    order_m[z] <- region[z]
    regionMsg <- cat(regionMsg, sprintf("%s%s間;\n", region[z], order_m[z, 2])) #sprintf為R的string format
}

#畫直方圖:https://kohske.wordpress.com/2010/12/29/faq-how-to-order-the-factor-variables-in-ggplot2/

d <- data.frame(縣市地區 = order_m[, 1], 醫療機構數 = as.numeric(order_m[, 2]))
#如果上一行醫療機構數沒轉numeric下一行才有作用
#d$`機構數` <- factor(as.numeric(d$`醫療機構數`), levels = unique(d$`醫療機構數`), ordered = TRUE) #開啟這行會變成醫療機構數升冪排列
#d <- d[order(d$`醫療機構數`, decreasing = TRUE),] #這行有沒有加都一樣
#print(d)
plot <- ggplot(d, mapping = aes(x = 縣市地區, y = 醫療機構數))
plot + theme_bw() + geom_bar(aes(), stat = "identity", fill = "orange", colour = "orange")

長條圖輸出結果:

產生訊息:

補充:

1.在將資料輸入ggplot2方法時,資料型態必須是資料框架(data.frame)型態。

2.在矩陣型態處理好資料排序,不一定轉換成data.frame後排序會一致,做分析前要檢查一下資料型態。

3.承2,產生圖表資料大小排序若不正確,可能是資料以字元型態做排序,而非數值型態。

4.呈3,不論行列資料,若為字元型態,則在ggplot圖表上會以字串因子方式呈現,而非連續的數值區間。

[測試]改寫data.frame轉換的那行程式碼(醫療機構數 移除as.numeric方法)

d <- data.frame(縣市地區 = order_m[, 1], 醫療機構數 = order_m[, 2])

重跑ggplot長條圖,結果為圖表中的Y軸亂掉