我在这里尝试了多种可能的解决方案,但是仍然难以根据时间过滤一列。我用lubridate将色谱柱变成hms。请指教。 R的新手,如果这看起来很多余,请道歉。
我尝试了filter命令,但似乎不起作用,因为数据类型错误。角色vs双。我认为这是因为使用了lubridate代码而导致的,但是我在这里可能是错误的。下面是相关部分的代码示例。
这是供参考的数据集的顶部。
> 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"
答案 0 :(得分:0)
这是您获取正确格式所需的条件:
iislog1$dtime <- with( iislog1, strptime(paste( iisdate,iistime),
format="%Y-%m-%d %HH %MM %SS"))
我认为您的输入格式与hms
函数无法接受的任何典型协议都足够接近。基数R更“完整”。
然后使用正确的“ datetime”值进行比较。或者,如果您想要一个不受日期限制的时间范围,请使用format
仅返回时间并进行alpha比较。在您的实例中,“ 21:38:37”与“ 4:40:59”的alpha比较将显示前者“小于”后者,因为前导字母为“ 4”和“ 2”。在正确构造的R日期时间中,“ 4:40:59”的格式版本应为“ 04:40:59”。
答案 1 :(得分:0)
您只是没有传递要过滤的数据框,而是传递了向量。注意区别
# 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"))