Как я могу получить весь последний месяц в R? - PullRequest
0 голосов
/ 05 октября 2018

Эй, спасибо, что нашли время, чтобы прочитать мой вопрос.

Я хотел бы извлечь весь прошлый месяц.Например, для сентября месяца 2018 (2018-09-01 - 2018-09-30) и сегодняшней даты

Sys.Date () [1] "2018-10-05"

`lst %>%
    mutate(taskDate = as.Date(taskDate)) %>%
    filter(taskDate >= as.Date(Sys.Date() %m-% months(1), '%Y%m%d')) %>%
    filter(taskDate != as.Date(Sys.Date(), 'month')) %>%
    select('taskMinutes','taskBillable') %>%
    group_by(taskBillable) %>%
    summarise(total = sum(as.numeric(taskMinutes))) %>%
    mutate(total = (total/60)) %>%
    mutate(total= as.numeric(total))`

Этот код получает следующий результат" 2018-09-05 "-" 2018-10-05 "И что я хочу, это получить только в прошлом месяце, например, 2018-09-01- 2018-09-30

что я мог сделать?

Данные

taskDate    taskMinutes taskBillable
2018-09-24T00:00:00 180 FALSE
2018-09-24T00:00:00 390 TRUE
2018-09-24T00:00:00 540 FALSE
2018-09-21T00:00:00 60  TRUE
2018-09-24T00:00:00 30  FALSE
2018-09-24T00:00:00 30  FALSE
2018-09-24T00:00:00 120 TRUE
2018-09-25T00:00:00 390 TRUE
2018-09-25T00:00:00 480 TRUE
2018-09-21T00:00:00 240 TRUE
2018-09-21T00:00:00 240 FALSE
2018-09-24T00:00:00 60  TRUE
2018-09-25T00:00:00 60  TRUE
2018-09-26T00:00:00 30  TRUE
2018-09-26T00:00:00 480 FALSE
2018-09-24T00:00:00 240 TRUE
2018-09-25T00:00:00 240 TRUE
2018-09-27T00:00:00 360 TRUE
2018-09-27T00:00:00 150 TRUE
2018-09-27T00:00:00 480 TRUE
2018-09-27T00:00:00 90  TRUE
2018-09-26T00:00:00 60  TRUE
2018-09-26T00:00:00 240 TRUE
2018-09-27T00:00:00 180 TRUE
2018-10-02T00:00:00 30  TRUE
2018-10-02T00:00:00 60  FALSE
2018-10-02T00:00:00 540 FALSE
2018-10-02T00:00:00 480 TRUE
2018-09-28T00:00:00 180 TRUE
2018-09-27T00:00:00 15  FALSE
2018-09-28T00:00:00 15  FALSE
2018-09-28T00:00:00 120 TRUE
2018-09-28T00:00:00 30  TRUE
2018-09-27T00:00:00 210 TRUE
2018-09-28T00:00:00 30  FALSE
2018-10-03T00:00:00 60  TRUE
2018-09-28T00:00:00 480 TRUE
2018-10-01T00:00:00 480 TRUE
2018-10-01T00:00:00 456 FALSE

1 Ответ

0 голосов
/ 05 октября 2018

Вы можете использовать lubridate и filter, убедитесь, что вы используете правильные операторы> =, <для правильного захвата всего месяца. </p>

library(dplyr)
library(lubridate)

df <- read.table(text =
"taskDate    taskMinutes taskBillable
2017-10-05T00:00:00 210 TRUE
2017-10-06T00:00:00 30  TRUE
2017-10-16T00:00:00 60  TRUE
2017-10-18T00:00:00 120 TRUE
2017-10-19T00:00:00 120 TRUE
2017-10-25T00:00:00 60  TRUE
2017-10-26T00:00:00 120 TRUE
2017-11-01T00:00:00 60  TRUE
2017-11-02T00:00:00 60  TRUE
2017-11-03T00:00:00 30  TRUE
2017-10-30T00:00:00 60  TRUE
2017-10-30T00:00:00 120 TRUE
2017-10-31T00:00:00 60  TRUE",
                 header = T,
                 stringsAsFactors = F)

# convert taskDate to date format
df$taskDate <- gsub("T", " ", df$taskDate) %>% ymd_hms()

str(df)

# 'data.frame': 13 obs. of  3 variables:
#  $ taskDate    : POSIXct, format: "2017-10-05" "2017-10-06" "2017-10-16" ...
#  $ taskMinutes : int  210 30 60 120 120 60 120 60 60 30 ...
#  $ taskBillable: logi  TRUE TRUE TRUE TRUE TRUE TRUE ...

# filter 0 note the (- years(1) + months(1)) could be removed, but is needed for the sample data
filter(df,
       taskDate >= floor_date(Sys.Date(), "month") - months(1) - years(1) + months(1),
       taskDate < ceiling_date(Sys.Date(), "month") - months(1) - years(1) + months(1))

#      taskDate taskMinutes taskBillable
# 1  2017-10-05         210         TRUE
# 2  2017-10-06          30         TRUE
# 3  2017-10-16          60         TRUE
# 4  2017-10-18         120         TRUE
# 5  2017-10-19         120         TRUE
# 6  2017-10-25          60         TRUE
# 7  2017-10-26         120         TRUE
# 8  2017-10-30          60         TRUE
# 9  2017-10-30         120         TRUE
# 10 2017-10-31          60         TRUE
...