Найти первое вхождение в группе - PullRequest
1 голос
/ 04 марта 2020

У меня есть таблица с 5 столбцами.

Country   Flow   %Rec    Date_Received(with timestamp)   Date
DE       DEF    10      2020-03-03 05:05:54       2020-03-03
DE       DEF    15      2020-03-03 07:25:24       2020-03-03
DE       DEF    20      2020-03-03 04:05:54       2020-03-02
DE       ABC    40      2020-03-02 03:05:54       2020-03-02
DE       ABC    50      2020-03-02 07:05:54       2020-03-02
DE       ABC    20      2020-03-01 06:05:54       2020-03-01

Я хочу найти% полученных от последней даты и первого вхождения date_re c. Требуется вывод:

Country   Flow   %Rec    Date_Received(with timestamp)   Date
DE       DEF    10      2020-03-03 05:05:54       2020-03-03
DE       ABC    40      2020-03-02 03:05:54       2020-03-02

Ответы [ 2 ]

1 голос
/ 04 марта 2020

В R мы можем сделать slice после группировки по «Страна», «Поток»

library(dplyr)
df %>%
   group_by(Country, Flow) %>% 
   slice(1)
# A tibble: 2 x 5
# Groups:   Country, Flow [2]
#  Country Flow  `%Rec` `Date_Received(with timestamp)` Date      
#  <chr>   <chr>  <int> <chr>                           <chr>     
#1 DE      ABC       40 2020-03-02 03:05:54             2020-03-02
#2 DE      DEF       10 2020-03-03 05:05:54             2020-03-03

. Выше предполагается, что «Дата» ordered (в примере ОП это уже заказано). Если нет, то конвертируйте в Date класс и используйте which.max

df %>%
    group_by(Country, Flow) %>%
    slice(which.max(as.Date(Date)))
# A tibble: 2 x 5
# Groups:   Country, Flow [2]
#  Country Flow  `%Rec` `Date_Received(with timestamp)` Date      
#  <chr>   <chr>  <int> <chr>                           <chr>     
#1 DE      ABC       40 2020-03-02 03:05:54             2020-03-02
#2 DE      DEF       10 2020-03-03 05:05:54             2020-03-03

data

df <- structure(list(Country = c("DE", "DE", "DE", "DE", "DE", "DE"
), Flow = c("DEF", "DEF", "DEF", "ABC", "ABC", "ABC"), `%Rec` = c(10L, 
15L, 20L, 40L, 50L, 20L), `Date_Received(with timestamp)` = c("2020-03-03 05:05:54", 
"2020-03-03 07:25:24", "2020-03-03 04:05:54", "2020-03-02 03:05:54", 
"2020-03-02 07:05:54", "2020-03-01 06:05:54"), Date = c("2020-03-03", 
"2020-03-03", "2020-03-02", "2020-03-02", "2020-03-02", "2020-03-01"
)), class = "data.frame", row.names = c(NA, -6L))
0 голосов
/ 04 марта 2020

В SQL вы бы использовали row_number() или коррелированный подзапрос:

select t.*
from t
where t.date_received = (select max(t2.date_received)
                         from t t2
                         where t2.country = t.country and t2.flow = t.flow
                        );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...