Как использовать дату в качестве фильтра - PullRequest
0 голосов
/ 19 ноября 2018

Мои знания R и сценариев в целом практически отсутствуют. Поэтому я надеюсь, что вы будете терпеливы с этим основным вопросом.

library(lubridate)
date.depature <- c("2016.06.16", "2016.11.16", "2017.01.05", "2017.01.12", "2017.02.25")
airport.departure <- c("CDG", "QNY", "QXO", "CDG", "QNY")
airport.arrival <- c("SYD", "CDG", "QNY", "SYD", "QXO")
amount <- c("1", "3", "1", "10", "5")
date.depature <- as_date(date.depature)
df <- data.frame(date.depature, airport.departure, airport.arrival, amount)

xtabs(as.integer(amount) ~ airport.arrival + airport.departure, df)

С помощью этого кода мы получаем сумму суммы в виде матрицы с аэропортами в виде строки / столбца. Теперь мне нужны только результаты для

  1. 2017
  2. 2017,01
  3. до 2017.01

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Вам необходимо указать date.departure в вашем вызове xtabs. Для года == 2017:

xtabs(as.integer(amount) ~ airport.arrival + airport.departure, df[year(df$date.depature)==2017,])

Для года == 2017 и месяца == 1:

xtabs(as.integer(amount) ~ airport.arrival + airport.departure, df[year(df$date.depature)==2017 & month(df$date.departure)==1,])

И для чего-либо до января 2017 года:

xtabs(as.integer(amount) ~ airport.arrival + airport.departure, df[df$date.depature<as_date("2017-01-01"),])
0 голосов
/ 19 ноября 2018

Поскольку вы уже используете lubridate, я собираюсь показать вам подход, использующий dplyr (часть tidyverse рядом с lubridate).

Все решения применимы. filter вместе с month, year и as_date работают с lubridate, чтобы создать условия для фильтрации ваших данных, а затем с помощью pipe %>% передать эту длину на xtabs

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date

date.depature <- c("2016.06.16", "2016.11.16", "2017.01.05", "2017.01.12", "2017.02.25")
airport.departure <- c("CDG", "QNY", "QXO", "CDG", "QNY")
airport.arrival <- c("SYD", "CDG", "QNY", "SYD", "QXO")
amount <- c("1", "3", "1", "10", "5")
date.depature <- as_date(date.depature)
df <- data.frame(date.depature, airport.departure, airport.arrival, amount)

# For 2017
df %>% 
  filter(year(date.depature) == 2017) %>% 
  xtabs(as.integer(amount) ~ airport.arrival + airport.departure, .)
#>                airport.departure
#> airport.arrival CDG QNY QXO
#>             CDG   0   0   0
#>             QNY   0   0   1
#>             QXO   0   4   0
#>             SYD   2   0   0

# 2017.01
df %>% 
  filter(year(date.depature) == 2017, month(date.depature) == 1) %>% 
  xtabs(as.integer(amount) ~ airport.arrival + airport.departure, .)
#>                airport.departure
#> airport.arrival CDG QNY QXO
#>             CDG   0   0   0
#>             QNY   0   0   1
#>             QXO   0   0   0
#>             SYD   2   0   0

# until 2017.01
df %>% 
  filter(date.depature <= as_date("2017.01.01")) %>% 
  xtabs(as.integer(amount) ~ airport.arrival + airport.departure, .)
#>                airport.departure
#> airport.arrival CDG QNY QXO
#>             CDG   0   3   0
#>             QNY   0   0   0
#>             QXO   0   0   0
#>             SYD   1   0   0

Создано в 2018-11-19 с помощью представительного пакета (v0.2.1)

0 голосов
/ 19 ноября 2018

Почему бы вам не принудить amount к классу "integer" при создании df?Просто избавьтесь от двойных кавычек в

amount <- c("1", "3", "1", "10", "5")

или

amount <- as.integer(c("1", "3", "1", "10", "5"))

Это потому, что as.integer(df$amount) не возвращает

c(1, 3, 1, 10, 5)

Когда вы создаете фрейм данных df, этот вектор приводится к классу "factor", и теперь у вас есть

as.integer(df$amount)
#[1] 1 3 1 2 4

Правильный путь будет

as.integer(as.character(df$amount))
#[1]  1  3  1 10  5

Или проще:

date.depature <- c("2016.06.16", "2016.11.16", "2017.01.05", "2017.01.12", "2017.02.25")
airport.departure <- c("CDG", "QNY", "QXO", "CDG", "QNY")
airport.arrival <- c("SYD", "CDG", "QNY", "SYD", "QXO")
amount <- c(1, 3, 1, 10, 5)
date.depature <- as_date(date.depature)
df <- data.frame(date.depature, airport.departure, airport.arrival, amount)

Теперь вопрос.

Это, в основном, проблема поднабора.
Подмножество данных, извлекающих нужные вам годы и месяцы, затем запускается так жеxtabs command.

df1 <- df[year(df$date.depature) == 2017, ]
df2 <- df1[month(df1$date.depature) == 1, ]
df3 <- cbind(df[year(df$date.depature) < 2017, ], df2)

Теперь xtabs, с подкадрами выше.

xtabs(amount ~ airport.arrival + airport.departure, df1)
xtabs(amount ~ airport.arrival + airport.departure, df2)
xtabs(amount ~ airport.arrival + airport.departure, df3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...