R數(shù)據(jù)科學最直接,也最讓人感到興奮的過程就是數(shù)據(jù)可視化,但是能夠直接用來進行可視化的數(shù)據(jù)少之又少,實際分析中基本碰不到,所以就需要對數(shù)據(jù)進行數(shù)據(jù)清洗過程。
在R中,我們最常見的數(shù)據(jù)類型就是數(shù)據(jù)框。對于數(shù)據(jù)框而言,每一列就是一個變量(variable),每一行就是一個觀測(observation),而每個單元格的值,就是觀測值(values)。

Fig1: Adapted from book of Hadley Wickham
我們可以通過一個例子來直觀地感受一下。
attach(iris)
mini_iris <- iris[c(1,51,101),]
mini_iris
> mini_iris
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
51 7.0 3.2 4.7 1.4 versicolor
101 6.3 3.3 6.0 2.5 virginica
其中花萼長度,花萼寬度,花瓣長度,花瓣寬度,以及品質(zhì)都是變量(vairable)名,序號1,51,101代表的是三條觀測記錄,單元格里代表的是每一個觀測值。
這個時候,我們需要將行名拆除,并且把行名塞進列里面,單元格的數(shù)字也變成一個新列,并且每一行只有一個觀測值。我們需要怎樣操作呢?
這時候就可以用到gather()函數(shù)。
> gather(mini_iris, key = "flower_attr",value = "attr_value", Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)
#如果要變換的variable實在是太多,無法一一指定,可以通過“-”反選一些不需要的列。
> gather(mini_iris, key = "flower_attr",value = "attr_value", -Species)
都會得到如下結(jié)果
Species flower_attr attr_value
1 setosa Sepal.Length 5.1
2 versicolor Sepal.Length 7.0
3 virginica Sepal.Length 6.3
4 setosa Sepal.Width 3.5
5 versicolor Sepal.Width 3.2
6 virginica Sepal.Width 3.3
7 setosa Petal.Length 1.4
8 versicolor Petal.Length 4.7
9 virginica Petal.Length 6.0
10 setosa Petal.Width 0.2
11 versicolor Petal.Width 1.4
12 virginica Petal.Width 2.5
而spread()函數(shù)的功能正好相反。是將行里面的數(shù)據(jù)又還到列里面去。
attach(iris)
mini_iris <- iris[c(1,51,101),]
flatted_data <- gather(mini_iris, key = "flower_attr",value = "attr_value", -Species)
spread(flatted_data, flower_attr)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
51 7.0 3.2 4.7 1.4 versicolor
101 6.3 3.3 6.0 2.5 virginica
(完)