агрегирование data.table по одному столбцу с использованием максимального значения другого столбца - R - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть data.table DT, который я хотел бы агрегировать по одному столбцу (году), используя максимальное значение другого столбца (месяца).Вот пример моей data.table.

> DT <- data.table(month = c("2016-01", "2016-02", "2016-03", "2017-01", "2017-02", "2017-03")
                  , col1 = c(3,5,2,8,4,9)
                  , year = c(2016, 2016,2016, 2017,2017,2017))

> DT
     month col1 year
1: 2016-01    3 2016
2: 2016-02    5 2016
3: 2016-03    2 2016
4: 2017-01    8 2017
5: 2017-02    4 2017
6: 2017-03    9 2017

Требуемый вывод

> ## desired output
    > DT
         month col1 year desired_output
    1: 2016-01    3 2016     2
    2: 2016-02    5 2016     2
    3: 2016-03    2 2016     2
    4: 2017-01    8 2017     9
    5: 2017-02    4 2017     9
    6: 2017-03    9 2017     9

Агрегируя по столбцу year, желаемым выводом должно быть значение col1 за последний месяц.Но почему-то следующий код не работает, он дает мне предупреждение и возвращает NA.Что я делаю не так?

> ## wrong output
 > DT[, output := col1[which.max(month)], by = .(year)]
    Warning messages:
    1: In which.max(month) : NAs introduced by coercion
    2: In which.max(month) : NAs introduced by coercion
> DT
     month col1 year output
1: 2016-01    3 2016     NA
2: 2016-02    5 2016     NA
3: 2016-03    2 2016     NA
4: 2017-01    8 2017     NA
5: 2017-02    4 2017     NA
6: 2017-03    9 2017     NA

1 Ответ

0 голосов
/ 05 декабря 2018

Мы получаем индекс максимального значения в «месяце», преобразовывая класс yearmon из zoo и используем его для получения соответствующего значения из «col1» при создании столбца «selected_output», сгруппированного по «year»

library(zoo)
library(data.table)
DT[, desired_output := col1[which.max(as.yearmon(month))], .(year)]
DT
#     month col1 year desired_output
#1: 2016-01    3 2016              2
#2: 2016-02    5 2016              2
#3: 2016-03    2 2016              2
#4: 2017-01    8 2017              9
#5: 2017-02    4 2017              9
#6: 2017-03    9 2017              9

Или извлеките «месяц» и получите индекс max значение

DT[, desired_output := col1[which.max(month(as.IDate(paste0(month,
                  "-01"))))], .(year)]
...