2012-05-22 213 views
6

我不明白爲什麼我找不到解決方案,因爲我覺得這是一個非常基本的問題。那麼需要尋求幫助。我想按月爲每個月重新排列空氣質量數據集,並設置最大的臨時值。另外我想找出每個月最高溫度的相應日期。什麼是最懶(代碼明智)的方式來做到這一點?根據另一列中的最高值選擇一個值

我曾嘗試以下沒有成功:

require(reshape2) 
names(airquality) <- tolower(names(airquality)) 
mm <- melt(airquality, id.vars = c("month", "day"), meas = c("temp")) 

dcast(mm, month + day ~ variable, max) 
aggregate(formula = temp ~ month + day, data = airquality, FUN = max) 

我這樣的事情後:

month day temp 
5  7 89 
... 

回答

5

有一段時間討論是否懶惰是好還是不好。 Anwyay,這是短暫的和自然的書寫和​​閱讀(快速大數據,這樣你就不需要更改或更新版本優化它):

require(data.table) 
DT=as.data.table(airquality) 

DT[,.SD[which.max(Temp)],by=Month] 

    Month Ozone Solar.R Wind Temp Day 
[1,]  5 45  252 14.9 81 29 
[2,]  6 NA  259 10.9 93 11 
[3,]  7 97  267 6.3 92 8 
[4,]  8 76  203 9.7 97 28 
[5,]  9 73  183 2.8 93 3 

.SD是每個組的數據子集,而你只需要它的最大Temp,iiuc。如果你需要行號,那麼可以添加。

或獲得其中最大綁在所有行:

DT[,.SD[Temp==max(Temp)],by=Month] 

    Month Ozone Solar.R Wind Temp Day 
[1,]  5 45  252 14.9 81 29 
[2,]  6 NA  259 10.9 93 11 
[3,]  7 97  267 6.3 92 8 
[4,]  7 97  272 5.7 92 9 
[5,]  8 76  203 9.7 97 28 
[6,]  9 73  183 2.8 93 3 
[7,]  9 91  189 4.6 93 4 
+0

謝謝你們!我以前沒有使用data.table包,所以這是一段時間。 「接受答案」,因爲這是最完整的(並且比Chritoph_J稍短)。儘管(大家都+1),你們都應該得到它。 – Mikko

+0

我想知道是否有任何語言的更簡潔的解決方案。我猜不是。 –

2

怎麼樣用plyr

max.func <- function(df) { 
    max.temp <- max(df$temp) 

    return(data.frame(day = df$Day[df$Temp==max.temp], 
        temp = max.temp)) 
} 

ddply(airquality, .(Month), max.func) 

正如你所看到的,月供最高溫度發生在一天以上。如果你想要不同的行爲,該功能很容易調整。

2

或者,如果你想使用data.table包(例如,如果速度是一個問題,並且數據集很大或者如果你喜歡的語法):

library(data.table) 
DT <- data.table(airquality) 
DT[, list(maxTemp=max(Temp), dayMaxTemp=.SD[max(Temp)==Temp, Day]), by="Month"] 

如果你想知道什麼.SD代表,看看這裏:SO

+0

我覺得你在那一個上打敗了我:) –

+0

時間,是的,兩秒鐘(時間來慶祝;-)但是你的'which.max'技巧是整潔的......所以+1! –

3

與plyr

require(reshape2) 
names(airquality) <- tolower(names(airquality)) 
mm <- melt(airquality, id.vars = c("month", "day"), meas = c("temp"), value.name = 'temp') 

library(plyr) 

ddply(mm, .(month), subset, subset = temp == max(temp), select = -variable) 

另一種方法使

month day temp 
1  5 29 81 
2  6 11 93 
3  7 8 92 
4  7 9 92 
5  8 28 97 
6  9 3 93 
7  9 4 93 

甚至更​​簡單

require(reshape2) 
require(plyr) 
names(airquality) <- tolower(names(airquality)) 
ddply(airquality, .(month), subset, 
    subset = temp == max(temp), select = c(month, day, temp)) 
相關問題