2015-08-21 4 views
0

Это должно быть невероятно просто, но мне не удается это понять. Я хочу получить максимальное значение для каждой группы, что я делаю следующим образом.найти максимальный коэффициент и индекс, который макс в r

ddply(dd,~group,summarise,max=max(value)) 

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

ddply(dd,~group,summarise,max=max(value))['date'] 

ответ

1

Если вы после даты, соответствующей строке (ов) со значениями макс, попробуйте subset, чтобы получить ряд макс вместе с select, чтобы получить столбцы вы после этого.

# reproducible example using `iris` 

# your original 
ddply(iris, ~Species, summarise, max=max(Sepal.Length)) 
#  Species max 
# 1  setosa 5.8 
# 2 versicolor 7.0 
# 3 virginica 7.9 


# now we want to get the Sepal.Width that corresponds to max sepal.length too. 
ddply(iris, ~Species, subset, Sepal.Length==max(Sepal.Length), 
     select=c('Species', 'Sepal.Length', 'Sepal.Width')) 
#  Species Sepal.Length Sepal.Width 
# 1  setosa   5.8   4.0 
# 2 versicolor   7.0   3.2 
# 3 virginica   7.9   3.8 

(Или вместо того, чтобы использовать select в subset вызова, просто использовать [, c('columns', 'I', 'want')] после ddply). Если для тех же самых видов, которые достигают максимума, существует несколько строк, это вернет их все.

Вы можете использовать summarise сделать это тоже, просто добавить date определение в вызове, но это немного менее эффективным (вычисление макс дважды):

ddply(iris, ~Species, summarise, 
     max=max(Sepal.Length), 
     width=Sepal.Width[which.max(Sepal.Length)]) 

Это будет возвращать только одну строку для каждого вида , и если есть несколько цветов с максимальной длиной спала для их видов, возвращается только первый (which.max возвращает первый из соответствующих индексов).

+0

работал отлично. спасибо за несколько решений. Для дальнейшего использования, это то, что я в конечном итоге выбрал. ddply (dd, ~ group, subset, value == max (value), select = c ('date2', 'value')) – SilvanD

1

Если мы используем data.table (используя iris набор данных), мы сводим data.frame в data.table, сгруппированных по группирования переменной («вид»), мы получаем индекс max значения одной переменной (» Sepal.Length ') и используйте это для подмножества столбцов, указанных в .SDcols.

library(data.table) 
dt <- as.data.table(iris) 
dt[, .SD[which.max(Sepal.Length)] , by = Species, 
       .SDcols= c('Sepal.Length', 'Sepal.Width')] 
Смежные вопросы