Как получить максимальное значение с помощью group_by и суммировать в R [duplicate]

Это чистое решение для JavaScript без каких-либо библиотек или плагинов:

document.addEventListener('click', function (e) {
    if (hasClass(e.target, 'bu')) {
        // .bu clicked
        // Do your thing
    } else if (hasClass(e.target, 'test')) {
        // .test clicked
        // Do your other thing
    }
}, false);

, где hasClass -

function hasClass(elem, className) {
    return elem.className.split(' ').indexOf(className) > -1;
}

Live demo

Кредит относится к Dave и Sime Vidas

Использование более современных JS, hasClass может быть реализовано как:

function hasClass(elem, className) {
    return elem.classList.contains(className);
}

36
задан Frank 17 February 2017 в 18:38
поделиться

9 ответов

Более короткое решение с использованием data.table:

setDT(group)[, .SD[which.max(pt)], by=Subject]
#    Subject pt Event
# 1:       1  5     2
# 2:       2 17     2
# 3:       3  5     2
51
ответ дан Arun 18 August 2018 в 19:21
поделиться
  • 1
    видя, что data.table имеет много изменений с 2014 года, является ли это по-прежнему самым быстрым / лучшим решением этого вопроса? – Ben 24 May 2016 в 21:03
  • 2
  • 3
    Привет, Что такое $ V1 здесь? #новичок – sriharsha KB 1 June 2016 в 13:53
  • 4
    Доступ к столбцу с автосознанием. Запустите его, чтобы он не понял лучше. – Arun 1 June 2016 в 14:19
  • 5
    это работает хорошо. можете ли вы объяснить, что делает .I в data.table? – HappyCoding 27 June 2017 в 03:26
52
ответ дан Arun 7 September 2018 в 03:37
поделиться
56
ответ дан Arun 30 October 2018 в 07:45
поделиться

Другой вариант - slice

library(dplyr)
group %>%
     group_by(Subject) %>%
     slice(which.max(pt))
#    Subject    pt Event
#    <dbl> <dbl> <dbl>
#1       1     5     2
#2       2    17     2
#3       3     5     2
-1
ответ дан akrun 18 August 2018 в 19:21
поделиться
do.call(rbind, lapply(split(group,as.factor(group$Subject)), function(x) {return(x[which.max(x$pt),])}))

Использование Base R

2
ответ дан Kalees Waran 18 August 2018 в 19:21
поделиться

Я не был уверен, что вы хотите сделать в столбце «Событие», но если вы хотите сохранить это, как насчет

isIDmax <- with(dd, ave(Value, ID, FUN=function(x) seq_along(x)==which.max(x)))==1
group[isIDmax, ]

#   ID Value Event
# 3  1     5     2
# 7  2    17     2
# 9  3     5     2

Здесь мы используем ave, чтобы посмотреть на Столбец «Значение» для каждого «ИД». Затем мы определяем, какое значение является максимальным, а затем превращаем его в логический вектор, который мы можем использовать для подмножества исходного кадра данных.

6
ответ дан MrFlick 18 August 2018 в 19:21
поделиться
  • 1
    Большое спасибо, но у меня есть еще один вопрос. Зачем использовать функцию в этом методе, поскольку ave (Value, ID, FUN = function (x) seq_along (x) == which.max (x)) == 1 работает очень хорошо? Я немного смущен. – Xinting WANG 4 July 2014 в 13:38
  • 2
    Я использовал with, потому что немного странно иметь данные как внутри, так и снаружи group data.frame. Если вы прочитали данные с помощью read.table или чего-то еще, вам нужно будет использовать with, потому что эти имена столбцов не будут доступны за пределами data.frame. – MrFlick 4 July 2014 в 16:56

Если вы хотите получить наибольшее значение pt для объекта, вы можете просто использовать:

   pt_max = as.data.frame(aggregate(pt~Subject, group, max))
0
ответ дан Mutyalama 18 August 2018 в 19:21
поделиться

Решение dplyr:

> library(dplyr)
> ID <- c(1,1,1,2,2,2,2,3,3)
> Value <- c(2,3,5,2,5,8,17,3,5)
> Event <- c(1,1,2,1,2,1,2,2,2)
> group <- data.frame(Subject=ID, pt=Value, Event=Event)
> group <- group_by(group, Subject)
> summarize(group, max.pt = max(pt))

Это дает следующий фрейм данных:

  Subject max.pt
1       1      5
2       2     17
3       3      5
3
ответ дан tkmckenzie 18 August 2018 в 19:21
поделиться
  • 1
    Я думаю, что OP хочет сохранить столбец Event в подмножестве, в этом случае вы могли бы сделать: df %>% group_by(Subject) %>% filter(pt == max(pt)) (включая ссылки, если они есть) – docendo discimus 3 July 2014 в 19:11

Наиболее интуитивным методом является использование функции group_by и top_n в dplyr

    group %>% group_by(Subject) %>% top_n(1, pt)

. Вы получите

    Source: local data frame [3 x 3]
    Groups: Subject [3]

      Subject    pt Event
        (dbl) (dbl) (dbl)
    1       1     5     2
    2       2    17     2
    3       3     5     2
26
ответ дан Xi Liang 18 August 2018 в 19:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: