Фильтрация по двум столбцам в кадре данных - PullRequest
2 голосов
/ 25 марта 2020

Я читаю .csv и мне нужно найти 5 лучших перевозчиков, которые отправили наибольшую массу товаров в AFRICOM или из него. Столбец «to» помечен SPOE_AOR, а столбец «from» - SPOD_AOR. Столбец «перевозчик» равен CARRIERS, а столбец «Вес» - WEIGHT.

Я не могу понять, как отфильтровать кадр данных так, чтобы он отображал только первые 5 весов в / из AFRICOM. Я тоже использую диплёр.

Ответы [ 3 ]

4 голосов
/ 25 марта 2020

Вы ищете топ-5 в / из двух отдельных списков или просто топ-5 в или из AFRICOM?

В любом случае, это должно помочь. Ниже я использую head(df, n) для отображения верхнего n из вашего информационного кадра. Комбинация arrange() для сортировки (desc() для убывания) и dplyr::filter() для выбора ваших условий:

head(
    df %>% arrange(desc(WEIGHT)) %>%
    dplyr::filter(SPOE_AOR=='AFRICOM' | SPOD_AOR=='AFRICOM')
, 5)

, что дает вам топ 5 либо АФРИКОМа. Для индивидуальных топ-5:

#top 5 to:
head(
    df %>% arrange(desc(WEIGHT)) %>%
    dplyr::filter(SPOE_AOR=='AFRICOM')
, 5)

#top 5 from:
head(
    df %>% arrange(desc(WEIGHT)) %>%
    dplyr::filter(SPOE_AOD=='AFRICOM')
, 5)
0 голосов
/ 25 марта 2020

Если вы ищете решение с базой R (без dplyr или data.table), вы можете использовать функцию aggregate для суммирования весов по операторам связи; для этого используйте только те сценарии, которые либо поступают, либо go поступают в AFRICOM:

total_weights <- aggregate(WEIGHT ~ CARRIERS, 
          data = dt[dt$SPOE_AOR == "AFRICOM" | dt$SPOD_AOR == "AFRICOM", ],
          sum)

. Затем отображаются первые пять:

head(total_weights[order(total_weights$WEIGHT, decreasing = TRUE), ], 5)
0 голосов
/ 25 марта 2020

Вот решение с data.table:

  1. Сначала убедитесь, что вы храните свои данные (я полагаю, они называются dt) как data.table.
library(data.table)
dt <- data.table(dt)
Выберите все записи, которые либо приходят, либо go в AFRICOM (a), суммируют их (b) на CARRIERS (c), упорядочивают их по этой сумме (d) и отображают первые пять (е).
dt[SPOE_AOR == "AFRICOM" | SPOD_AOR == "AFRICOM", # (a)
   .(TOTAL = sum(WEIGHT)),  # (b)
   CARRIERS][ # (c)
       order(TOTAL, decreasing = TRUE)][ # (d)
           1:5] # (e)

Если вы никогда не работали с data.table, это может показаться на первый взгляд ужасно сложным. Но его довольно легко освоить, и он дает вам большую гибкость и производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...