返回R中的rownumber作为第一个值,其中包含一整小时

返回R中的rownumber作为第一个值,其中包含一整小时,r,R,对于我正在运行的分析,我想知道数据集中的第一行,其中列时间是一整小时。例如,我有: df <- data.frame(x = c("14:56:00","14:57:00","14:58:00","14:59:00","15:00:00","15:01:00")) 我想找到行数,其中x是一整小时,在这种情况下是15:00:00 现在,如果它只返回第一个发生这种情况的情况,那就更好了,但我想我可以找到一种解决方法。我想也许grep是一种方法,但我认为它对时间函数不太管用。我们可以使用gre

对于我正在运行的分析,我想知道数据集中的第一行,其中列时间是一整小时。例如,我有:

df <- data.frame(x = c("14:56:00","14:57:00","14:58:00","14:59:00","15:00:00","15:01:00"))
我想找到行数,其中x是一整小时,在这种情况下是15:00:00

现在,如果它只返回第一个发生这种情况的情况,那就更好了,但我想我可以找到一种解决方法。我想也许grep是一种方法,但我认为它对时间函数不太管用。

我们可以使用grep

或者转换为日期时间类,然后进行评估

v1 <- strptime(df$x, "%H:%M:%S")
which.max(v1$sec==0 & v1 $min == 0)
#[1] 5
我们可以用grep

或者转换为日期时间类,然后进行评估

v1 <- strptime(df$x, "%H:%M:%S")
which.max(v1$sec==0 & v1 $min == 0)
#[1] 5

不是答案,但太长了,无法发表评论。我对这件事太好奇了,对讨论的各种选择都进行了计时。好消息!在使用POSIXlt、POSIXct或times对象时,有一种有效的方法可以做到这一点

包括可变强制时间
不是答案,但太长了,无法发表评论。我对这件事太好奇了,对讨论的各种选择都进行了计时。好消息!在使用POSIXlt、POSIXct或times对象时,有一种有效的方法可以做到这一点

包括可变强制时间
+第二个选项为1。grep看起来比使用POSIXlt对象慢大约150倍。如果您使用的是POSIXct对象,那么使用whichas.numericx%%3600==0可以得到类似的结果,尽管我确信有一些特质我没有考虑。@Benjamin我也尝试了一些使用chron和3600的时间的方法,但无法正确获得。谢谢如果我正确理解times对象,它们的数字表示是从00:00:00起24小时的比例。要使用times对象,我认为whichas.numericx%%1/24==0是正确的方法。同样,对于lubridate,which.maxminutex==0&secondx==0+1是第二个选项。grep看起来比使用POSIXlt对象慢大约150倍。如果您使用的是POSIXct对象,那么使用whichas.numericx%%3600==0可以得到类似的结果,尽管我确信有一些特质我没有考虑。@Benjamin我也尝试了一些使用chron和3600的时间的方法,但无法正确获得。谢谢如果我正确理解times对象,它们的数字表示是从00:00:00起24小时的比例。要使用times对象,我相信whichas.numericx%%1/24==0将是正确的方法。此外,还添加了lubridate,which.maxminutex==0&secondx==0。我不确定这是否会改变我的方法,但主要是因为我倾向于将变量设置为我希望用于分析的任何类型,然后选择一种方法来处理该类型。但在静态数据集中,这种方法的差异是无关紧要的。在一些更具活力和流动性的东西中,它可能会产生更大的影响。哇,谢谢本杰明。这是一个我必须在一个循环中重复280次的分析,所以速度方面实际上是非常适用的。我不确定这是否会改变我的方法,但主要是因为我倾向于将变量设置为我希望用于分析的任何类型,然后选择一种方法来处理该类型。但在静态数据集中,这种方法的差异是无关紧要的。在一些更具活力和流动性的东西中,它可能会产生更大的影响。哇,谢谢本杰明。这是一个分析,我必须在一个循环中重复280次,所以速度方面实际上是非常适用的。
library(chron)
library(microbenchmark)
library(lubridate)

x <- c("14:56:00",
        "14:57:00",
        "14:58:00",
        "14:59:00",
        "15:00:00",
        "15:01:00")

x <- x[sample(seq_along(x), 10000, replace = TRUE)]

x_times <- times(x)
x_lt <- strptime(x, "%H:%M:%S")
x_ct <- as.POSIXct(x, format = "%H:%M:%S")

microbenchmark(
  grep = grep(":00:00", x),
  substr = which(substr(x, 3, 8) == ":00:00"),
  posixlt = which(x_lt$min == 0 & x_lt$sec == 0),
  posixct = which(as.numeric(x_ct) %% 3600 == 0),
  chron_times = which(as.numeric(x_times) %% (1/24) == 0),
  lubridate_lt = which(minute(x_lt) == 0 & second(x_lt) == 0),
  lubridate_ct = which(minute(x_ct) == 0 & second(x_ct) == 0)
)
Unit: microseconds
         expr      min        lq      mean    median        uq       max neval cld
         grep 1874.412 1882.4765 1900.3438 1887.9015 1897.8715  2090.239   100  b 
       substr  737.508  743.9590  780.8664  745.7180  748.3570  1843.328   100 a  
      posixlt  266.851  270.0780  295.3843  272.4230  275.0630  1436.600   100 a  
      posixct  244.272  248.0840  268.9425  249.5500  252.3365  1365.341   100 a  
  chron_times  244.272  249.4040  269.2798  251.7495  256.7345  1078.257   100 a  
 lubridate_lt  286.206  290.6045  315.7149  294.8565  300.5750  1415.487   100 a  
 lubridate_ct 3100.169 3128.1750 4017.1479 3166.1495 4038.4020 50903.542   100   c
microbenchmark(
  grep = grep(":00:00", x),
  substr = which(substr(x, 3, 8) == ":00:00"),
  posixlt = {
    x_lt <- strptime(x, "%H:%M:%S")
    which(x_lt$min == 0 & x_lt$sec == 0)
  },
  posixct = {
    x_ct <- as.POSIXct(x, format = "%H:%M:%S")
    which(as.numeric(x_ct) %% 3600 == 0)
  },
  chron_times = {
    x_times <- times(x)
    which(as.numeric(x_times) %% (1/24) == 0)
  },
  lubridate_lt = {
    x_lt <- strptime(x, "%H:%M:%S")
    which(minute(x_lt) == 0 & second(x_lt) == 0)
  },
  lubridate_ct = {
    x_ct <- as.POSIXct(x, format = "%H:%M:%S")
    which(minute(x_ct) == 0 & second(x_ct) == 0)
  }
)

Unit: microseconds
         expr        min         lq        mean     median          uq        max neval   cld
         grep   1877.931   1894.353   1908.4255   1898.604   1905.2030   2109.300   100 a    
       substr    739.853    748.651    796.1005    750.704    754.0755   2083.788   100 a    
      posixlt  64857.238  65131.127  66115.4777  65293.731  66145.3095 113194.606   100   c  
      posixct 127864.696 128861.283 130728.4082 129356.279 130059.3290 191846.601   100    d 
  chron_times   8319.317   9237.315  10899.4629   9526.746   9779.0825  59084.740   100  b   
 lubridate_lt  64874.832  65149.895  65733.2789  65315.431  65820.5420  79871.888   100   c  
 lubridate_ct 131143.743 132104.263 133843.4980 132782.388 133162.1380 182147.867   100     e