Невозможно отфильтровать столбец, если имя этого столбца получено из переменной - PullRequest
0 голосов
/ 06 августа 2020

По умолчанию я устанавливаю аргумент cut.points как NA, и если он по умолчанию, он не должен ничего делать с данными.

Но если пользователь решает ввести, например, cut.points = c("2012-01-01", "2013-01-01"), тогда данные должен быть отфильтрован по столбцу, в котором есть даты. И он должен возвращать только даты с 2012 по 2013 год. Проблема в том, что я читаю данные из функции, поэтому теоретически я не знаю, как называется этот столбец даты, который использует предоставляет. Итак, я нахожу столбец с датами и сохраняю его имя в переменной.

Но условие, которое я написал, которое должно фильтровать на основе этой переменной, не работает:

modifier <- function(input.data, cut.points = c(NA, NA)) {
  date_check <- sapply(input.data, function(x) !all(is.na(as.Date(as.character(x),format="%Y-%m-%d"))))
  if (missing(cut.points)) {
    input.data
  } else {
    cols <- colnames(select_if(input.data, date_check == TRUE))
    cut.points <- as.Date(cut.points)
    input.data <- filter(input.data, cols > cut.points[1] & cols < cut.points[2])
  }
}

для ex . когда я пытаюсь запустить это:

modifier(ex_data, cut.points = c("2012-01-01", "2013-01-01"))

В примере, подобном этому:

    ex_data
   Row.ID        Order.ID Order.Date
1   32298  CA-2012-124891 2012-07-31
2   26341   IN-2013-77878 2013-02-05
3   25330   IN-2013-71249 2013-10-17
4   13524 ES-2013-1579342 2013-01-28
5   47221    SG-2013-4320 2013-11-05
6   22732   IN-2013-42360 2013-06-28
7   30570   IN-2011-81826 2011-11-07
8   31192   IN-2012-86369 2012-04-14
9   40155  CA-2014-135909 2014-10-14
10  40936  CA-2012-116638 2012-01-28
11  34577  CA-2011-102988 2011-04-05
12  28879   ID-2012-28402 2012-04-19
13  45794    SA-2011-1830 2011-12-27
14   4132  MX-2012-130015 2012-11-13
15  27704   IN-2013-73951 2013-06-06
16  13779 ES-2014-5099955 2014-07-31
17  36178  CA-2014-143567 2014-11-03
18  12069 ES-2014-1651774 2014-09-08
19  22096   IN-2014-11763 2014-01-31
20  49463    TZ-2014-8190 2014-12-05

ошибка: символьная строка не в стандартном однозначном формате

1 Ответ

0 голосов
/ 06 августа 2020

Я добавил lubridate как зависимость, чтобы получить доступ к %within% и is.Date. Я также изменил условие проверки, потому что не думаю, что ваш исходный будет работать с NA, NA.

library(tidyverse)
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#> 
#>     date, intersect, setdiff, union

ex_data <- read_table("   Row.ID        Order.ID Order.Date
1   32298  CA-2012-124891 2012-07-31
2   26341   IN-2013-77878 2013-02-05
3   25330   IN-2013-71249 2013-10-17
4   13524 ES-2013-1579342 2013-01-28
5   47221    SG-2013-4320 2013-11-05
6   22732   IN-2013-42360 2013-06-28
7   30570   IN-2011-81826 2011-11-07
8   31192   IN-2012-86369 2012-04-14
9   40155  CA-2014-135909 2014-10-14
10  40936  CA-2012-116638 2012-01-28
11  34577  CA-2011-102988 2011-04-05
12  28879   ID-2012-28402 2012-04-19
13  45794    SA-2011-1830 2011-12-27
14   4132  MX-2012-130015 2012-11-13
15  27704   IN-2013-73951 2013-06-06
16  13779 ES-2014-5099955 2014-07-31
17  36178  CA-2014-143567 2014-11-03
18  12069 ES-2014-1651774 2014-09-08
19  22096   IN-2014-11763 2014-01-31
20  49463    TZ-2014-8190 2014-12-05")
#> Warning: Missing column names filled in: 'X1' [1]

modifier <- function(input.data, cut.points = NULL) {
    if (length(cut.points) == 2) {
        date_col <- colnames(input.data)[sapply(input.data, is.Date)]
        filtered.data <- input.data %>%
            rename(Date = !! date_col) %>%
            filter(Date %within% interval(cut.points[1], cut.points[2])) %>%
            rename_with(~ date_col, Date)
        return(filtered.data)
    } else {
        input.data
    }
}
modifier(ex_data, cut.points = c("2012-01-01", "2013-01-01"))
#> # A tibble: 5 x 4
#>      X1 Row.ID Order.ID       Order.Date
#>   <dbl>  <dbl> <chr>          <date>    
#> 1     1  32298 CA-2012-124891 2012-07-31
#> 2     8  31192 IN-2012-86369  2012-04-14
#> 3    10  40936 CA-2012-116638 2012-01-28
#> 4    12  28879 ID-2012-28402  2012-04-19
#> 5    14   4132 MX-2012-130015 2012-11-13
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...