Как уникальная функция возвращает только уникальные значения в кадре данных? - PullRequest
0 голосов
/ 05 января 2019

У меня есть фрейм данных, который я хочу отфильтровать контейнером количества контейнера на каждой станции в данный момент времени в зависимости от типа контейнера. Используемые данные содержат дату выпуска и получения, станцию ​​прибытия, уникальный код контейнера и тип контейнера. Одна строка кадра данных - это одно движение.

library(dplyr)
library(tidyverse)
library(lubridate)

release.date <- as_date(c("2017-12-15","2018-05-31", "2017-03-03", "2017-11-16", "2017-10-15", "2017-12-22", "2017-12-02"))
receive.date <- as_date(c("2018-12-15","2018-08-31", "2017-09-03", "2017-12-16", "2017-11-15", "2017-12-24", "2017-12-02"))

Routen2 <- data.frame(release.date, receive.date, destination.station = c("New York", "London", "New York", "London", "New York", "New York", "New York"), container.code = c("A1", "B2", "B1", "B1", "B4", "B3", "A1"), container.type = c("a", "b", "b", "b", "b", "b", "a"))

Идея состоит в том, чтобы фильтровать каждое движение, которое начинается после крайнего срока (2017.12.31). Затем закажите его после даты выпуска и используйте уникальную функцию, чтобы получить только самое новое движение каждого отдельного контейнера, которое произошло до установленного срока. Затем отфильтруйте дату получения для крайнего срока, чтобы исключить контейнер, все еще находящийся в движении И, наконец, получить счет на станциях с типами контейнеров.

Routen2 %>%
  filter(release.date <= "2017-12-31") %>%
  .[order(.$release.date),] %>%
  .[unique(.$container.code, fromLast = TRUE),] %>%
  filter(receive.date <= "2017-12-31") %>%
  count(destination.station, container.type)

Результат должен выглядеть следующим образом:

  destination.station container.type     n  
1 New York            a                  1  
2 New York            b                  2  
3 London              b                  1

В этом примере данных Результат полностью отсутствует в Лондоне. Параметр container.code не уникален после уникальной функции (когда скрипт запускается без двух последних строк). Почему не работает?

1 Ответ

0 голосов
/ 05 января 2019

Вместо использования функций base R (order, unique) функции tidyverse (arrange, distinct) могут заменить его в цепочке. Кроме того, filter может принимать несколько аргументов

library(tidyverse)
Routen2 %>% 
    filter(release.date <= "2017-12-31", receive.date <= "2017-12-31")  %>% 
    arrange(desc(release.date)) %>% 
    distinct(container.code, .keep_all = TRUE) %>% 
    count(destination.station, container.type)
# A tibble: 3 x 3
#  destination.station container.type     n
#  <fct>               <fct>          <int>
#1 London              b                  1
#2 New York            a                  1
#3 New York            b                  2

Проблема в коде OP заключается в использовании unique для поднабора строк. Он возвращает unique элементы файла container.code, а не какой-либо индекс строки или логический индекс. Вместо этого должно быть duplicated, которое возвращает логический индекс

Routen2 %>%
   filter(release.date <= "2017-12-31", receive.date <= "2017-12-31")%>%
  .[order(.$release.date),] %>% 
  .[!duplicated(.$container.code, fromLast = TRUE), ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...