質問
これがかなり基本的な質問であると感じてから、私はこれの解決策を見つけることができない理由はわかりません。その後助けを求める必要があります。私は毎月最大の温度値で月ごとのデータセットを並べ替えたいです。さらに、私は毎月の最高温度ごとに対応する日を見つけたいです。これを行うための最も怠惰な(コードワイズ)方法は何ですか?
成功せずに追跡した後に試みました:
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
...
. 解決
怠惰であるかどうかについての絶対に戻ってきたときにかなりの議論がありました。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
は各グループのデータのサブセットであり、最大の温度、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
. 他のヒント
PLYR
のもう1つのアプローチ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) )
. 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)
.
あなたが見ることができるように、月の最大温度は1日以上上がります。異なる動作が必要な場合は、機能を調整するのに十分簡単です。
またはdata.table
パッケージを使用したい場合(例えば、Speedが問題がある場合はデータ・セットが大きい場合、または構文を希望する場合):
library(data.table)
DT <- data.table(airquality)
DT[, list(maxTemp=max(Temp), dayMaxTemp=.SD[max(Temp)==Temp, Day]), by="Month"]
.
.SD
がどのようなものかを知りたいのであれば、ここに見てください。
所属していません StackOverflow