【问题标题】:How to find the proportion of time that values were greater than x, in R?如何在R中找到值大于x的时间比例?
【发布时间】:2021-04-19 14:24:50
【问题描述】:

我有一个包含日期/时间序列的数据框,我正在尝试查找值高于 > x 的每月时间量(对于这个问题,假设 > 5)。

这是一个示例数据框

# Create a, b, c, d variables
a <- c("06-25-20 08:00:00 AM","06-25-20 08:15:00 AM",
       "06-25-20 08:30:00 AM","06-25-20 08:45:00 AM",
       "07-25-20 08:45:00 AM", "07-25-20 08:45:00 AM",
       "08-25-20 08:45:00 AM", "08-25-20 08:45:00 AM",
       "09-25-20 08:45:00 AM","09-25-20 08:45:00 AM")
b <- c(4,5,8, "N/A", 4,5,"N/A",7,7,6)
c <- c(6,10,8, "N/A", 8,5,"N/A",8,7,2)
# Join the variables to create a data frame
df <- data.frame(a,b,c)
df$a = as.POSIXlt(df$a, format="%m-%d-%y%H:%M:%S", tz = 'EST')

我先把日期和时间分开

#Put date and time into seperate columns
df$Day <- as.Date(stewiacke_WA$a)
df$Time <- format(df$b,"%H:%M:%S")

我还有 2 个问题。首先,Time 列是class(character),当我使用代码时

df$Time = as.POSIXct(df$Time, format = "%H:%M:%S", tz = 'EST')

Time 列添加了日期。

我的第二个问题是,我不知道如何计算每个列值 > 5 的每月时间量。有人可以帮忙吗?

【问题讨论】:

    标签: r date time


    【解决方案1】:

    lubridate 包在处理日期和时间时非常有用。 我还将使用dplyr 来计算每月bc 高于5 的时间。

    library(lubridate)
    library(dplyr)
    
    # Create a, b, c, d variables
    a <- c(
      "06-25-20 08:00:00 AM",
      "06-25-20 08:15:00 AM",
      "06-25-20 08:30:00 AM",
      "06-25-20 08:45:00 AM",
      "07-25-20 08:45:00 AM",
      "07-25-20 08:45:00 AM",
      "08-25-20 08:45:00 AM",
      "08-25-20 08:45:00 AM",
      "09-25-20 08:45:00 AM",
      "09-25-20 08:45:00 AM"
    )
    

    在数据中定义缺失值时,请确保使用NA 而不是"N/A"

    b <- c(4, 5, 8, NA, 4, 5, NA, 7, 7, 6)
    c <- c(6, 10, 8, NA, 8, 5, NA, 8, 7, 2)
    

    tibble() 而不是data.frame() 可以更容易地查看列的类。

    df <-
      tibble(a, b, c) 
    
    df$a = as.POSIXlt(df$a, format = "%m-%d-%y%H:%M:%S", tz = 'EST')
    
    df$month <- month(df$a)
    

    每个月b 的时间大于 5 个

    df %>%
      group_by(month) %>% 
      mutate(prev_a = lag(a, 1),
             diff_time = a - prev_a) %>% 
      filter(b > 5) %>% 
      summarise(sum_diff_time = sum(diff_time, na.rm = TRUE))
    #> `summarise()` ungrouping output (override with `.groups` argument)
    #> # A tibble: 3 x 2
    #>   month sum_diff_time
    #>   <dbl> <drtn>       
    #> 1     6 900 secs     
    #> 2     8   0 secs     
    #> 3     9   0 secs
    

    c 也是如此

    df %>%
      group_by(month) %>% 
      mutate(prev_a = lag(a, 1),
             diff_time = a - prev_a) %>% 
      filter(c > 5) %>% 
      summarise(sum_diff_time = sum(diff_time, na.rm = TRUE))
    #> `summarise()` ungrouping output (override with `.groups` argument)
    #> # A tibble: 4 x 2
    #>   month sum_diff_time
    #>   <dbl> <drtn>       
    #> 1     6 1800 secs    
    #> 2     7    0 secs    
    #> 3     8    0 secs    
    #> 4     9    0 secs
    

    注意:这里假设 bc 的值在当时是相同的 aa 的前一个值。我猜你正在寻找一个结果 与此有些不同,但这应该为您指明正确的方向。

    【讨论】:

    • 所以第一部分有效,但至于b超过5的比例......我实际上是在寻找b> 5的时间比例
    • 我很确定我是否完全理解您在寻找什么。那么,如果连续时间戳的b 值大于 5,那么两个时间戳之间的时间是否会被计为大于 5?如果有一个时间戳高于 5 但之前和之后低于 5 怎么办?那要怎么算?如果您可以更新您的问题以更明确地说明这一点,我可以看看。
    • 刚刚编辑过。基本上,我想知道一个月中有多少时间是 b > 5
    • 我没有看到该问题的任何相关更新。我对您现在提出问题的方式的问题是它可以以多种方式解释。您拥有的数据是时间戳快照,但您正在寻找基于对这些时间戳之间/之前/之后发生的情况的假设的结果。只要我不知道这些假设,我就不确定如何最好地回答您的问题。
    • 哦,我明白你的意思了。
    猜你喜欢
    • 2022-06-26
    • 2023-01-14
    • 2016-09-30
    • 1970-01-01
    • 2022-01-19
    • 2018-06-19
    • 2017-03-17
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多