8

我不明白为什么我找不到解决方案,因为我觉得这是一个非常基本的问题。那就需要求助了。我想按月重新排列空气质量数据集,每个月的最大温度值。另外我想找到每个月最高气温对应的日子。这样做的最懒惰(代码方面)的方法是什么?

我试过以下但没有成功:

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
...
4

4 回答 4

8

前段时间关于懒惰是好是坏的讨论颇多。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
于 2012-05-22T15:56:10.593 回答
4

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) )
于 2012-05-23T02:03:04.467 回答
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)

如您所见,该月的最高温度发生在一天以上。如果您想要不同的行为,该功能很容易调整。

于 2012-05-22T15:44:13.507 回答
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

于 2012-05-22T15:55:56.103 回答