1. 程式人生 > >04# 資料分析 學習筆記(一)

04# 資料分析 學習筆記(一)

二、R的讀寫

讀資料 
---read.table('tablename')  或者 read.csv('tablename')
     read.tabls('school.csv',header=T,sep=",")  =  read.csv
#read.table()函式可以讀取txt、csv等格式的檔案,並且可以直接從URL上讀取資料。主要引數如下
read.table(file,                     #檔案路徑
           header=FALSE,             #是否將第一行讀為列名
           sep = "",                 #檔案的分隔符
           nrows = -1,               #讀取的行數
           skip = 0,                 #跳過開始的skip開始讀取
           fill = !blank.lines.skip) #將缺少資料定位為NA
寫出到csv檔案
---write.csv(iris,file="iris.csv")
     write.csv(iris,file="iris.csv")
大檔案讀取
一、readr包  需要讀取的資料特別大的話可以用
install.packages("readr")
library(readr)
system.time(read_table(file))
system.time(read.table(gile))
二、data.table包中的fread函式讀取大規模資料
system.time(fread(file)) 
system.time(read.table(file))
連結資料庫
install.packages("RMySQL")
library(RMySQL)
     待續
三、R的資料整理
資料變換
取資料子集
--使用方括號加索引來取子集
--subset函式
例如:取iris中花種類為setosa的子集,並取後三列資料
data_sub <- subset(iris,Species=='setosa',3:5)
data_sub <- with(iris,iris[Species=='setosa',3:5])
編碼轉換(在原來資料集的基礎上加一個數據集) 
iris <- transform(iris,v1=Sepal.length + Petal.Width
等同於
iris$v = iris$Sepal.length + iris$Petal.Width #(transform函式速度快)
變數的離散化
--將變數根據數值的大小分為四組,
--cut函式
people = data.frame(age=c(13,42,55,64,30,53,24),
                    gender=c("M","F","F","M","M","F","M"))
groupvec = c(0,40,60,100)
labels <- c("青年","中年","老年")
people$label <- with(people,
                     cut(people$age,                          breaks = groupvec,                          labels = labels)
                     )
#資料型別變換  《變換為因子型別》
vec <- rep(c(0,1),c(4,6))
vec_fac <- factor(vec,labels = c('male','femal'))
levels(vec_fac)
##因子合併
vec <- rep(c(0,1,3),c(4,6,2))
vec_fac <- factor(vec)
levels(vec_fac) <- c('male','femal','male')
##因子重設
vec <- rep(c('b','a'),c(4,6))
vec_fac <- factor(vec)
levels(vec_fac)
relevel(vec_fac,ref='b')  #以b為標準
資料重塑
install.packages('reshape2') library(reshape2) subdata <-iris[,4:5] dcast函式
dcast(data=subdata,             #分析物件
      formula=Species~.,      #資料分組方式
      value.var='Petal.Width',  #要計算的資料物件
      fun=mean)                 #計算方式
##dcast的思路和aggregate很相似,都是根據變數切分資料
##在對分組資料進行計算,但dcast的輸出格式和功能在多維情況下要方便很多
melt函式 將一個寬型資料融合成一個長型資料, #例如我們將isir資料集進行融合
iris_long <- melt(data=iris,
                  id='Species')
#小案例 分析小費給的和男女的關係 head(tips) dcast(tips,       sex~.,       value.var = 'tip',       fun=mean) dcast(tips,       sex~smoker,       value.var = 'tip',       fun=mean) dcast(tips,       sex~smoker + day,       value.var = 'tip',       fun=mean) ##dcast函式的使用前提    # -資料中已經存在分類的變數,例如sex或者smoke    # -根據分類變數劃分資料    # -在計算某個數值變數的指標  #如果有更復雜的需求,可以先融合成長型資料,在重鑄 tips_melt <- melt(tips,                   id.vars = c('sex','smoker','time','size','day')) dcast(tips_melt,       sex~variable,       value.var = 'value',       fun= mean) #要同時考慮不同性別和吸菸習慣的貴客給小費的相對比例 tips_mean <- dcast(tips_melt,                    sex+ smoker~variable,                    fun=mean) tips_mean$rate <- with(tips_mean,                        tip/total_bill) tips_mean
拆分合並
類似與sql中的join merge合併函式
datax <- data.frame(id=c(1,2,3),
                    gender=c(23,34,41))
datay <- data.frame(id=c(3,2,1,4),
                    name=c('tom','john','ken','han'))
merge(datax,datay,by='id')
拆分: 如果資料集有一個因子型變數就可以用split函式進行拆分
iris_splited <- split(iris,
                      f=iris$Species)  #分組依據
class(iris_splited)
彙總資料
 強大的plyr包
install.packages('plyr') library(plyr) ratio_fun <- function(x){   sum(x$tip)/sum(x$total_bill) } ddply函式 ddply(.data=tips,         #拆分計算的物件          .variables='sex',   #按照什麼變數拆分      .fun=ratio_fun)     #計算函式 ddply(tips,       .(sex),       .fun = ratio_fun) 其他輔助函式 each:生成一系列函式值,組成向量
colwise:對資料框的每一個滿足條件的列做運算 colwise(mean,is.numeric) (iris)