2012-05-22 3 views
6

이것이 기본적인 해결책이라고 생각하기 때문에 왜 해결책을 찾을 수 없는지 이해할 수 없습니다. 그렇다면 도움을 청해야합니다. 나는 매월 최고 온도로 한달에 한 번씩 공기 품질 데이터 세트를 재정비하고 싶다. 또한 매월 최대 온도에 해당하는 날짜를 찾고 싶습니다. 이렇게하는 게 가장 지루한 (코드별로) 방법은 무엇입니까?다른 열의 가장 높은 값을 기준으로 값을 선택하십시오.

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 각 그룹에 대한 데이터의 하위 집합입니다, 가장 큰 온도 인 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을 약 :이 같은 후 오전

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) 

:

내가 성공하지 않고 다음과 같은 시도?

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 일 이상에 걸립니다. 다른 동작을 원할 경우 조정하기가 쉽습니다.

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

시간의 현명한, 예, 2 초 (축하하는 시간 ;-)하지만 당신의'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)) 
관련 문제