資料處理--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
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。