R的資料群聚計算

在這個例子中,我們使用 R 內建的 mtcars 資料集

setwd('~/Documents/Dropbox/Courses/生態資訊學/examples/aggregate_dat/')
mtcars
# 先把資料載入
attach(mtcars)
aggregate(mtcars$hp, by=list(cyl), 
          FUN=mean, omit.na=T)


接下來我們使用 data.table 來計算不同汽缸數的車子其平均馬力為多少

library(data.table)
mtcars.dt <- data.table::as.data.table(mtcars)
mtcars.dt[, mean(hp, na.rm = T), by = cyl]

接下來使用中央氣象局的某測站部分資料來當做範例,要特別注意的是,中央氣象局的原始資料中,有一些特別的數值,例如 -9991 代表了儀器故障待修,這些特別的數值需要移除,所以我們把他們當成 null value strings (na.strings)

met <- fread('meteodata.txt', na.strings = c('-9991','-9996','-9997','-9998','-9999'))
met

在上述資料中,欄位名稱 yyyymmdd 代表西元四位數年、月、日的日期戳記。TX01 代表氣溫,PP01 代表雨量。若我們想要計算每個月的平均溫度、最高溫度以及最低溫度,該如何計算呢?

可以這樣思考:

  1. 先將 yyyymmdd 轉換成月份,例如 20070101 即為 1、 200070102 也是 1
  2. 再使用 aggregate 的觀念,計算出平均溫度等統計值

在步驟一中,我們可以把整數轉換成 POSIX 的日期格式戳記,會使用到 as.POSIXct 以及 strptime 這兩個函式 (strptime 預設會轉成 POSIXlt 格式,但 POSIXct 在資料使用上比較方便,)。

我們先建立一個時間戳記(timestamp)的欄位,在 data.table 中 := 代表建立一個新的欄

met[, timestamp := as.POSIXct(strptime(yyyymmdd, '%Y%m%d'))]

接下來使用 data.table::month() 自動計算月份,並存成一個新的欄位叫做 month

met[, month := data.table::month(timestamp)]
met

最後使用 mean() 來計算,記得也要加上 na.rm = T,因為可能每個時間區間中,有可能會掉資料或是資料不足的情況。舉例來說,有些自動測站壞掉後,就會有一堆 -9999 值,所以這些當成 NA 的值需要剔除計算,否則計算出來的平均會有問題。

met[, mean(TX01, na.rm = T), by = month]

Comments

comments powered by Disqus