統計中待分析的資料框通常有兩種形式:(1)長型資料(堆疊資料),長型資料是各變數取值在一列中,而對應的變數名在另一列。(2)寬型資料(非堆疊資料),寬型資料一般是各變數取實值型別一致,而變數以不同列的形式構成。(常用)1. 例如iris的前四列子集即是一個典型的寬型資料。例如下面將寬型資料轉為長型資料:data_w <- iris[,1:4]data_l <- stack(data_w)head(data_l) values ind1 5.1 Sepal.Length2 4.9 Sepal.Length3 4.7 Sepal.Length4 4.6 Sepal.Length5 5.0 Sepal.Length6 5.4 Sepal.Lengthdata_w <- unstack(data_l)只要在一列中存在分類變數,都可以將其看作是長型資料。在上例中iris的前四列可以看作是寬型資料,但最後兩列可以看作是一個長型資料。2. 可以根據Species變數將資料轉為寬型。並得到各花種類的平均值。> subdata<-iris[,4:5]> head(subdata) #長型資料 Petal.Width Species1 0.2 setosa2 0.2 setosa3 0.2 setosa4 0.2 setosa5 0.2 setosa6 0.4 setosa> data_w<-unstack(subdata)> head(data_w) setosa versicolor virginica #寬型資料1 0.2 1.4 2.52 0.2 1.5 1.93 0.2 1.5 2.14 0.2 1.3 1.85 0.2 1.5 2.26 0.4 1.3 2.1> colMeans(data_w) #列平均值 setosa versicolor virginica 0.246 1.326 2.026 資料重塑計算3. 在上例中我們先轉換資料格式再計算分析結果,而更常見的是一步直接得到分析結果。library(reshape2)dcast(data=subdata, # 分析對象formula=Species~., # 資料分組的方式value.var='Petal.Width', # 要計算的數值對象fun=mean) # 計算用函數名 Species .1 setosa 0.2462 versicolor 1.3263 virginica 2.026dcast的思路和aggregate很相似,都是根據變數切分資料,再對分組後的資料進行計算,但dcast的輸出格式和功能在多維情況下要方便很多。4. 將一個寬型資料融合成一個長型資料,即melt函數。例如我們將iris資料集進行融合。iris_long <- melt(data=iris, # 要融合的對象id='Species') # 哪些變數不參與到融合中> head(iris_long) Species variable value1 setosa Sepal.Length 5.12 setosa Sepal.Length 4.93 setosa Sepal.Length 4.74 setosa Sepal.Length 4.65 setosa Sepal.Length 5.06 setosa Sepal.Length 5.4一個純粹的長型資料,只包含一個數值變數,其它均為分類變數。而一個純粹的寬型資料,則不包含分類變數,均為數值變數。而現實中的資料多半是二者的混雜,正如iris資料集那樣。5. 下面的例子就是將之前產生的資料進行匯總計算dcast(data=iris_long,formula=Species~variable,value.var='value',fun=mean) Species Sepal.Length Sepal.Width1 setosa 5.006 3.4282 versicolor 5.936 2.7703 virginica 6.588 2.974 Petal.Length Petal.Width1 1.462 0.2462 4.260 1.3263 5.552 2.026dcast函數的使用前提資料中已經存在分類變數,例如sex或者smoke根據分類變數劃分資料再計算某個數值變數的指標6. 小練習tips資料集練習,它是一個餐廳侍者收集的關於小費的資料,其中包含了七個變數,包括總費用、付小費的金額、付款者性別、是否吸煙、日期、日間、顧客人數。計算不同性別顧客是否會支付不同的小費比例。則可以按sex變數彙集資料。或者,按sex和size變數劃分資料,分別計算小費金額。dcast(tips,sex~.,value.var='tip',fun=mean)dcast(tips,sex~size,value.var='tip',fun=mean)7. 合并兩個資料框按id號將它們合為一個資料框。不能使用cbind來合并,因為id的順序不一樣。使用merge函數,按照id來合并兩組資料,這種操作思路和資料庫操作中的join是類似的。datax <- data.frame(id=c(1,2,3),gender=c(23,34,41))datay <- data.frame(id=c(3,1,2),name=c('tom','john','ken'))merge(datax,datay,by='id')8. 資料按變數拆分常規的資料分拆其實就是取子集,使用subset函數即可完成。非常規一點的資料拆分是按照某個分類變數進行的。例如需要對iris資料中按不同的花的屬性來分拆資料,使用split函數。iris_splited <- split(iris,f=iris$Species)class(iris_splited) #拆分後資料類型為列表list[1] "list"> head(iris_splited[[1]])9. 資料按變數合并split函數可以將一個資料框拆分成多個資料框,存在一個列表對象中。合并這個列表,只需要使用unsplit函數即可。unsplit(iris_splited,f=iris$Species)