다른 열에서 가장 높은 값을 기반으로 값을 선택하십시오.

StackOverflow https://stackoverflow.com//questions/10705290

  •  13-12-2019
  •  | 
  •  

문제

왜 이것이 꽤 기본적인 질문이라고 생각하기 때문에 이것에 대한 해결책을 찾을 수없는 이유를 이해하지 못합니다.도움을 요청해야합니다.매월 최대 온도 값으로 AirQuality 데이터 세트를 월별로 재정렬하고 싶습니다.또한 매월 최대 온도에 해당하는 날을 찾고 싶습니다.가장 좋아하는 (코드 현명한) 방법은 무엇입니까?

성공하지 않고 다음을 시도했습니다.

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로 원하는 것입니다.행 번호가 필요한 경우 추가 할 수 있습니다.

또는 MAX가 묶는 모든 행을 가져 오려면 :

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

의 또 다른 접근법
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)
.

보시다시피, 매월 최대 온도가 하루 이상 일어납니다.다른 동작을 원한다면 기능을 조정할 정도로 쉽습니다.

또는 data.table 패키지 (예 : 속도가 문제가 있고 데이터 세트가 크거나 구문을 선호하는 경우)를 사용하려는 경우 :

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

.SD가 무엇을 의미하는지 알고 싶다면 여기를 바라보십시오 : 그래서

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top