1. 程式人生 > >R語言-資料框分組求平均值

R語言-資料框分組求平均值

【技術關鍵】

1、從excel把資料讀到資料框

2、演算法實現將資料框的一些資料合為新的資料並組成新的資料框

3、將處理結果,即新的資料框儲存到excel檔案(或.csv)

4、將繪圖結果輸出到PDF檔案儲存


最近在嘗試分析近日的環境溫溼度變化;

雖然裝置只運行了48小時左右;

但收集到的有效資料有30000+(當然對於R而言這算很小意思的了);

由於環境溫溼度在一小段時間內基本保持穩定;

所以在分析幾日內的溫溼度變化情況時可以以每10min為單位記錄資料;

這就需要一個指令碼,能將資料有效劃分為單位後求均值再儲存到表;

###################################################
# - Filename : washData.R
# - Author : Johan   Version : 1.0   Date : 2018/5/3
# - Discription : 將excel表中的資料分10min計算平均值
#                 並儲存到excel
# - Function list : 
# 1.
# - Others : 
# 1.本程式可分析.xls或.csv檔案
###################################################

# 引用包
library(RODBC)

# 設定工作目錄
setwd("H:/mySoftware/R/myData")

# 匯入資料到myDataFrame,檔名根據需要改變
# 開啟th_record2.xls,並讀取表Sheet1
channel <- odbcConnectExcel2007("th_record2.xls")
myDataFrame <- sqlFetch(channel, "Sheet1")
odbcClose(channel)

# 為myDataFrame增加列名
dataColName <- c("temp","humi","time","year","month","day","hour","minute","second")
names(myDataFrame) <- dataColName

# 初始化快取向量
# 時分秒為起始量,可修改
NUM <- c()           # 編號
TEMP <- c()          # 溫度
HUMI <- c()          # 溼度
t <- 0               # 溫度快取
h <- 0               # 溼度快取
num <- 0             # 編號快取
dn <- 0              # 計數器
flag <- FALSE        # 儲存指示

# 迴圈處理資料
for(i in 1 : 31600){
  
  # 當前分鐘是否為10的倍數
  if(myDataFrame$minute[i] %% 10 == 0){
    
    # 計算上一組資料的均值並儲存
    if(flag){
      t <- t / dn
      h <- h / dn
      TEMP <- c(TEMP, t)
      HUMI <- c(HUMI, h)
      num <- num + 1
      NUM <- c(NUM, num)
      flag <- FALSE
    }
    
    # 快取復位
    dn <- 0
    t <- 0
    h <- 0
    
    # 新增記錄
    t <- t + myDataFrame$temp[i]
    h <- h + myDataFrame$humi[i]
    dn <- dn + 1
    
  }
  
  else{
    
    # 新增記錄
    t <- t + myDataFrame$temp[i]
    h <- h + myDataFrame$humi[i]
    dn <- dn + 1
    flag <- TRUE
    
  }
}

# 構建新資料框
newFrame <- data.frame(NUM, TEMP, HUMI)
newName <- c("number","temp","humi")
names(newFrame) <- newName

# 寫入.csv檔案
write.csv(newFrame, "new_th_record.csv")

# 繪圖
plot(newFrame$number, newFrame$temp, pch=20, lty=3, col="red")
lines(newFrame$number, newFrame$humi, pch=20, lty=3, col="blue")




把處理結果儲存到新的.csv或者.xls檔案即是整個指令碼的目的所在,方便後面的資料分析。

執行後得到的效果如下:(由於溫溼度的數值不在一個層次所以反映得不太直觀,可嘗試調換plot和lines的順序,通過繪圖方面的學習可以畫出更好看的圖)


如果想要輸出為PDF儲存該圖片,可以執行另一個指令碼:

pdf("new_th_record.pdf")
plot(newFrame$number, newFrame$humi, pch=20, lty=3, col="blue")
lines(newFrame$number, newFrame$temp, pch=20, lty=3, col="red")
dev.off()
PDF檔案的一個好處就是它裡面的圖片是向量的,也就是說放大圖片不會改變圖片的原樣,原本看上去粘在一塊兒的點放大以後能看出來是分開的。