Выберите значение для на основе наибольшего значения в другом столбце

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

  •  13-12-2019
  •  | 
  •  

Вопрос

Я не понимаю, почему я не могу найти решение для этого, так как я чувствую, что это довольно простой вопрос.Нужно попросить о помощи, то.Я хочу переставить набор данных AirQuale по месяцам с максимальным значением TEMP для каждого месяца.Кроме того, я хочу найти соответствующий день для каждой месячной максимальной температуры.Что такое ленивый (код-мудрый) способ сделать это?

Я пробовал после успеха:

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

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