Фильтрация данных с максимальной датой и извлечение данных за последние 3 месяца - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь отфильтровать данные за последние 3 месяца по максимальной дате в моей колонке.

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

last_three_month <- df_1[date_format > max(as.Date(date_format)) %m-% months(4) & 
                         date_format <= max(date_format) , ]

Когда я использую df_1[MonthYear] и фильтрую данные, я вижу ошибку вроде

"Ошибка: 'max' не имеет значения для факторов"

Данные

MonthYear   Number    Risk 
1/18/2019   101      High AESI
1/18/2019   905 
1/18/2019   909 
1/18/2019   904 
2/18/2019   101      High AESI
2/18/2019   905 
2/18/2019   904 
2/18/2019   909 
2/18/2019   907 
2/18/2019   541      High AESI
2/18/2019   908      High AESI
2/18/2019   906      High AESI
2/18/2019   046 
2/18/2019   018      High AESI
2/18/2019   019 
2/18/2019   002      High AESI
3/18/2019   904 
3/18/2019   907 
3/18/2019   905 

Код

library(dplyr)
library(tibble)
library(reshape)

Input <- read.csv("C:/Users/Documents/Exports/HR.csv")
Output <- Input #%>% filter(Year == 2019)
df_output <- as.data.frame(Output)
date_format <- as.Date(paste("01-", df_output$Month.Year, sep = ""), 
                       format = "%d-%b-%y")
df_1 <- cbind(df_output, date_format)

last_three_month <- df_1[date_format > max(as.Date(date_format)) %m-% months(4) &
                         date_format <= max(date_format) , ]

На самом деле я пытаюсь фильтровать данные непосредственно во фрейме данных, а не добавлять еще один столбец и достигать его.Можете ли вы, пожалуйста, посоветовать - Спасибо

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Попробуйте использовать seq(), как показано @G. Гротендика ответит здесь , чтобы получить дату три месяца назад от max MonthYear .

Данные (некоторые даты преобразованы в 2018 для демонстрации трехмесячного фильтра)

txt <- 'MonthYear   Number    Risk 
"1/18/2018"   101      "High AESI"
"1/18/2018"   905      NA
"1/18/2019"   909      NA
"1/18/2019"   904      NA 
"2/18/2018"   101      "High AESI"
"2/18/2018"   905      NA 
"2/18/2019"   904      NA 
"2/18/2019"   909      NA 
"2/18/2019"   907      NA 
"2/18/2019"   541      "High AESI"
"2/18/2019"   908      "High AESI"
"2/18/2019"   906      "High AESI"
"2/18/2019"   046      NA 
"2/18/2019"   018      "High AESI"
"2/18/2019"   019      NA 
"2/18/2019"   002      "High AESI"
"3/18/2018"   904      NA 
"3/18/2019"   907      NA 
"3/18/2019"   905      NA '

Input <- read.table(text=txt, header=TRUE)

Код

# CONVERT TO DATE
Input$MonthYear <- as.Date(Input$MonthYear, format = "%m/%d/%Y")

# SUBSET DATA
last_three_month_df <- subset(Input, MonthYear > seq(as.Date(max(MonthYear)), length=2, by="-3 months")[2] &
                                     MonthYear <= max(MonthYear))    

last_three_month_df 
#     MonthYear Number      Risk
# 3  2019-01-18    909      <NA>
# 4  2019-01-18    904      <NA>
# 7  2019-02-18    904      <NA>
# 8  2019-02-18    909      <NA>
# 9  2019-02-18    907      <NA>
# 10 2019-02-18    541 High AESI
# 11 2019-02-18    908 High AESI
# 12 2019-02-18    906 High AESI
# 13 2019-02-18     46      <NA>
# 14 2019-02-18     18 High AESI
# 15 2019-02-18     19      <NA>
# 16 2019-02-18      2 High AESI
# 18 2019-03-18    907      <NA>
# 19 2019-03-18    905      <NA>
1 голос
/ 02 апреля 2019

read.csv импортирует строки (такие как "1/18/2019") как столбцы 'фактор' по умолчанию. Этот категориальный класс данных не является датой. Вместо этого используйте readr::read_csv, который, вероятно, обнаружит, что ваш столбец даты является датой, и затем должен позволить вашему коду работать так, как вы ожидаете. Если вы используете мастер импорта RStudio с опцией readr , вы можете вручную выбрать типы столбцов, и для вас будет создан соответствующий код.

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