04# 資料分析 學習筆記(一)
阿新 • • 發佈:2019-02-12
二、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))
連結資料庫
三、R的資料整理install.packages("RMySQL")library(RMySQL)待續
資料變換
取資料子集
--使用方括號加索引來取子集--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)