1. 程式人生 > >資料處理--reshape2包(長寬資料)

資料處理--reshape2包(長寬資料)

寬資料

ozone wind temp
1 23.62 11.623 65.55
2 29.44 10.267 79.10
3 59.12 8.942 83.90
4 59.96 8.794 83.97

長資料

variable  value

1 ozone 23.615
2 ozone 29.444
3 ozone 59.115
4 ozone 59.962
5 wind 11.623
6 wind 10.267
7 wind 8.942
8 wind 8.794
9 temp 65.548
10 temp 79.100
11 temp 83.903
12 temp 83.968

長資料有一列資料是變數的型別,有一列是變數的值。長資料不一定只有兩列。ggplot2需要長型別的資料,plyr也需要長型別的資料,大多數的模型(比如lm(), glm()以及gam())也需要長資料。
2. reshape2 包

reshape2 用得比較多的是melt和cast兩個函式。

melt函式對寬資料進行處理,得到長資料;
cast函式對長資料進行處理,得到寬資料;

2.1 melt函式

此處用R內建的airquality資料集,首先將列名改成小寫,然後檢視相應的資料

names(airquality) <- tolower(names(airquality))
head(airquality)

ozone solar.r wind temp month day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6

先看看直接用metl函式處理上述的資料,會有什麼結果。

aql <- melt(airquality) # [a]ir [q]uality [l]ong format
head(aql)

variable value
1 ozone 41
2 ozone 36
3 ozone 12
4 ozone 18
5 ozone NA
6 ozone 28

然後再看看末尾的幾個資料

tail(aql)

variable value

913 day 25
914 day 26
915 day 27
916 day 28
917 day 29
918 day 30

預設情況下,melt認為所有數值列的變數均有值。很多情況下,這都是我們想要的情況。在這裡,我們想知道每個月(month)以及每天(day)的ozone, solar.r, wind以及temp的值。因此,我們需要告訴melt,month和day是”ID variables”。ID variables就是那些能夠區分不同行資料的變數,個人感覺類似於資料庫中的主鍵。

aql <- melt(airquality, id.vars = c(“month”, “day”))
head(aql)

month day variable value
1 5 1 ozone 41
2 5 2 ozone 36
3 5 3 ozone 12
4 5 4 ozone 18
5 5 5 ozone NA
6 5 6 ozone 28

如果我們想修改長資料中的列名,該如何操作呢?

aql <- melt(airquality, id.vars = c(“month”, “day”),
variable.name = “climate_variable”,
value.name = “climate_value”)
head(aql)

month day climate_variable climate_value
1 5 1 ozone 41
2 5 2 ozone 36
3 5 3 ozone 12
4 5 4 ozone 18
5 5 5 ozone NA
6 5 6 ozone 28

2.2 cast函式

從寬格式資料變換到長格式的資料比較直觀,然後反過來則需要一些二外的功夫。

在reshape2中有好幾個cast版本的函式。若你經常使用data.frame,就需要使用dcast函式。acast函式返回向量、矩陣或者陣列。

dcast藉助於公式來描述資料的形狀,左邊引數表示”ID variables”,而右邊的引數表示measured variables。可能需要幾次嘗試,才能找到合適的公式。

這裡,我們需要告知dcast,month和day是ID variables,variable則表示measured variables。

aql <- melt(airquality, id.vars = c(“month”, “day”))
aqw <- dcast(aql, month + day ~ variable)
head(aqw)

month day ozone solar.r wind temp
1 5 1 41 190 7.4 67
2 5 2 36 118 8.0 72
3 5 3 12 149 12.6 74
4 5 4 18 313 11.5 62
5 5 5 NA NA 14.3 56
6 5 6 28 NA 14.9 66

head(airquality) # original data

ozone solar.r wind temp month day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6

除了需要調整下列變數的順序,我們已經恢復出原始資料。下圖將有助解釋所發生的情況。

here is the dcast illustration

藍色陰影塊是能夠表示每一行資料的ID variables;紅色陰影塊包含了將待生成資料的列名;而灰色的資料表示用於填充相關區域的資料。

令人產生疑惑的情況往往是,一個數據單元有一個以上的資料。比如,我們的ID variables不包含day,

dcast(aql, month ~ variable)

month ozone solar.r wind temp
1 5 31 31 31 31
2 6 30 30 30 30
3 7 31 31 31 31
4 8 31 31 31 31
5 9 30 30 30 30

同時還有以下的警告資訊

Aggregation function missing: defaulting to length

再次檢視dcast的輸出資料,可以看到每個單元是month與climate組合的個數。所得到資料是month對應的day的記錄數。當每個單元有多個數據是,需要告訴dcast如何聚合(aggregate)這些資料,比如取均值(mean),計算中位數(median),或者簡單的求和(sum)。比如,在這裡,我們簡單的計算下均值,同時通過na.rm = TRUE刪除NA值。

dcast(aql, month ~ variable, fun.aggregate = mean, na.rm = TRUE)

month ozone solar.r wind temp
1 5 23.61538 181.2963 11.622581 65.54839
2 6 29.44444 190.1667 10.266667 79.10000
3 7 59.11538 216.4839 8.941935 83.90323
4 8 59.96154 171.8571 8.793548 83.96774
5 9 31.44828 167.4333 10.180000 76.90000

作者:leengsmile
連結:http://www.jianshu.com/p/31d4512ed97f
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。