由於'reshape2'和'plyr'包的靈活性,此問題有多個答案。我將展示最簡單的例子之一瞭解這裏:
library(reshape2)
library(plyr)
aqm <- melt(airquality, id=c("Month", "Day"), na.rm=TRUE)
aqm_ply <- ddply(aqm, .(Month, variable), summarize, min=min(value), max=max(value))
aqm_melt <- melt(aqm_ply, id=c("Month", "variable"), variable.name="variable2")
dcast(aqm_melt, Month ~ variable + variable2)
# Month Ozone_min Ozone_max Solar.R_min Solar.R_max Wind_min Wind_max Temp_min Temp_max
# 1 5 1 115 8 334 5.7 20.1 56 81
# 2 6 12 71 31 332 1.7 20.7 65 93
# 3 7 7 135 7 314 4.1 14.9 73 92
# 4 8 9 168 24 273 2.3 15.5 72 97
# 5 9 7 96 14 259 2.8 16.6 63 93
步驟1:讓我們把它分解爲若干步驟。首先,讓我們單獨定義'aqm',並從融化的數據中進行工作。這會讓這個例子更容易理解。
aqm <- melt(airquality, id=c("Month", "Day"), na.rm=TRUE)
# Month Day variable value
# 1 5 1 Ozone 41.0
# 2 5 2 Ozone 36.0
# 3 5 3 Ozone 12.0
# 4 5 4 Ozone 18.0
# ...
# 612 9 30 Temp 68.0
步驟2:現在,我們要以取代「最小值」和「最大值」列中的「價值」欄。我們可以使用'plyr'軟件包中的'ddply'功能來實現這一點。爲此,我們使用'ddply'函數(數據幀作爲輸入,數據幀作爲輸出,因此「dd」-ply)。我們首先指定數據。
ddply(aqm,
然後我們指定我們想要用來分組數據的變量'Month'和'variable'。我們使用.
函數直接引用這些變量,而不是引用它們包含的值。
ddply(aqm, .(Month, variable),
現在我們需要選擇一個聚合函數。我們在這裏選擇summarize
函數,因爲我們有我們不希望包含在最終數據中的列(「日」和「值」)。 summarize
函數將刪除所有原始的非分組列。
ddply(aqm, .(Month, variable), summarize,
最後,我們指定每個組的計算。我們可以參考原始數據框('aqm')的列,儘管它們不會包含在我們的最終數據框中。這是它的外觀:
aqm_ply <- ddply(aqm, .(Month, variable), summarize, min=min(value), max=max(value))
# Month variable min max
# 1 5 Ozone 1.0 115.0
# 2 5 Solar.R 8.0 334.0
# 3 5 Wind 5.7 20.1
# 4 5 Temp 56.0 81.0
# 5 6 Ozone 12.0 71.0
# 6 6 Solar.R 31.0 332.0
# 7 6 Wind 1.7 20.7
# 8 6 Temp 65.0 93.0
# 9 7 Ozone 7.0 135.0
# 10 7 Solar.R 7.0 314.0
# 11 7 Wind 4.1 14.9
# 12 7 Temp 73.0 92.0
# 13 8 Ozone 9.0 168.0
# 14 8 Solar.R 24.0 273.0
# 15 8 Wind 2.3 15.5
# 16 8 Temp 72.0 97.0
# 17 9 Ozone 7.0 96.0
# 18 9 Solar.R 14.0 259.0
# 19 9 Wind 2.8 16.6
# 20 9 Temp 63.0 93.0
步驟3:我們可以看到,數據被大大減少,因爲ddply
功能聚合了線。現在我們需要再次對數據進行融合,所以我們可以得到最終數據幀的第二個變量。請注意,我們需要指定一個新的參數variable.name
,所以我們沒有兩列名爲「變量」。
aqm_melt <- melt(aqm_ply, id=c("Month", "variable"), variable.name="variable2")
# Month variable variable2 value
# 1 5 Ozone min 1.0
# 2 5 Solar.R min 8.0
# 3 5 Wind min 5.7
# 4 5 Temp min 56.0
# 5 6 Ozone min 12.0
# ...
# 37 9 Ozone max 96.0
# 38 9 Solar.R max 259.0
# 39 9 Wind max 16.6
# 40 9 Temp max 93.0
步驟4:我們可以通過我們的數據鑄造成最終的形式終於包裹了這一切。
dcast(aqm_melt, Month ~ variable + variable2)
# Month Ozone_min Ozone_max Solar.R_min Solar.R_max Wind_min Wind_max Temp_min Temp_max
# 1 5 1 115 8 334 5.7 20.1 56 81
# 2 6 12 71 31 332 1.7 20.7 65 93
# 3 7 7 135 7 314 4.1 14.9 73 92
# 4 8 9 168 24 273 2.3 15.5 72 97
# 5 9 7 96 14 259 2.8 16.6 63 93
希望這個例子能給你足夠的理解,讓你開始。請注意,'plyr'軟件包的新數據框優化版本正在積極開發'dplyr'名稱,因此您可能希望在代碼變得更加完備後將其轉換爲新軟件包。
你是否還在開始時跑過名字(airquality)< - tolower(names(airquality))? –
不,這些姓氏已經是小寫字母......沒有必要。 – mrcalvin