Время фильтра в столбце - PullRequest
0 голосов
/ 16 мая 2019

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

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

вот верхняя часть набора данных для справки.

> head(iislog1,n=10)
      iisdate    iistime                                 csUriStem timeTaken
1  2019-05-10 4H 35M 10S                              /claraportal      7375
2  2019-05-10 4H 35M 11S                              /claraportal       484
3  2019-05-10 4H 35M 11S                              /claraportal       468
4  2019-05-10 4H 35M 13S                              /claraportal      1024
5  2019-05-10 4H 35M 54S                              /claraportal      5765
6  2019-05-10 4H 35M 57S               /claraportal/content/bundle      2019
7  2019-05-10 4H 35M 57S   /claraportal/dashboard.fwk.style/bundle      2019
8  2019-05-10 4H 35M 57S /claraportal/bundle/css/modules/2019v1_v1      2238
9  2019-05-10 4H 35M 57S           /claraportal/scripts/thirdparty      2457
10 2019-05-10 4H 35M 58S               /claraportal/content/bundle       921


#change data type for date and time columns
iislog$iisdate <- ymd(iislog$iisdate)
iislog$iistime <- hms(iislog$iistime)
#create subset of the original data
iislog1 <- iislog %>% select(iisdate,iistime,csUriStem,timeTaken)
#ensure the csUriStem column is in all lowercase. This is because the URLs
#seem to have mixed case and therefore can show up moe than once.
iislog1$csUriStem <- tolower(iislog1$csUriStem)
#filter the rows to find times between
iislog1 <- filter(iislog1$iistime > '04:40:59' & iislog1$iistime < '21:38:37')

> iislog1 <- filter(iislog1$iistime > '04:40:59' & iislog1$iistime < '21:38:37')
Error in UseMethod("filter_") : 
  no applicable method for 'filter_' applied to an object of class "logical"

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Вы просто не передали кадр данных для фильтрации, вы передали вектор. Обратите внимание на разницу

# failes
iislog1 <- filter(iislog1$iistime > '04:40:59' & iislog1$iistime < '21:38:37')

# works   |--missing--|   
iislog1 <- iislog1 %>% filter(iislog1$iistime > '04:40:59' & iislog1$iistime < '21:38:37')

tidyverse сияет за то, что он менее многословен, чем базовая R. Большая экономия заключается в том, что в трубопроводе нет необходимости каждый раз называть фрейм данных (т. Е. df$col). Вы можете , но сначала вам нужно что-то передать, например, вы не можете

df %>% filter(df$col < 2)

но это само по себе

filter(df$col < 2)

Это потому, что все глаголы dplyr ожидают, что первым аргументом будет объект, который нужно передать, а затем вернут фрейм данных. Эти три вещи одинаковы

filter(df, col < 2)
df %>% filter(., col < 2)
df %>% filter(col < 2)

Итак, filter() ожидал кадр данных, и вы передали ему вектор df$col, и он не знал, что делать. Я надеюсь, что это объяснение имеет смысл. Книга R for Data Science - отличный ресурс для этого и бесплатный онлайн.

В общем, лучший способ выполнить все ваши шаги - что-то вроде этого

library(tidyverse)
library(lubridate)


raw_data <-
  tibble(
    iisdate = "2019-05-10",
    iistime = paste0(1:23, "H 35M 11S"),
    csUriStem = "/ClaraPortal",
    timeTaken = 7375,
    a_column_you_dont_need = "a",
    another_one = "b"
  ) 


iislog <-
  raw_data %>% 
  mutate(
    iisdate = ymd(iisdate),
    iistime = hms(iistime),
    csUriStem = tolower(csUriStem)
  ) %>% 
  select(iisdate:timeTaken) %>% 
  filter(iistime > hms("04:40:59"), iistime < hms("21:38:37"))
0 голосов
/ 16 мая 2019

Вот что вам нужно для правильного форматирования:

iislog1$dtime <- with( iislog1, strptime(paste( iisdate,iistime),
                                         format="%Y-%m-%d %HH %MM %SS"))

Я не думаю, что ваш формат ввода достаточно близок к какому-либо типичному протоколу, чтобы быть принятым функцией hms. База R более «полная».

Затем используйте правильное значение «дата-время» для сравнения. Или, если вы хотите диапазон времени независимо от даты, используйте format, чтобы вернуть только время и сделать альфа-сравнение. В вашем случае, альфа-сравнение «21: 38: 37» с «4:40:59» показало бы, что первое «меньше» второго, поскольку начальные буквы были «4» и «2». Отформатированная версия «4:40:59» в правильно скомпонованной дате и времени R будет «04: 40: 59».

...