代码之家  ›  专栏  ›  技术社区  ›  Fern

R中按时间的平均值

  •  1
  • Fern  · 技术社区  · 7 年前

    我每秒都会测量化合物的浓度。我想平均30秒和60秒。我一直在读这里的帖子,我试过了 lubridate dplyr . 但运气不好。我正在努力使这项工作,但我一直未能做到。我正在从SAS过渡到R,请耐心等待。

    这是我的数据:

    head (data)#show the first 6 rows
    
       Date     Time  Temp      Appb    Bppb    Cppb     Dppb    Eppb      Fppb
    
    1 10/30/17 21:32:33 25.23 -0.469304 22.4445 35.5993 -18.4843 52.0488 -2.947340   
    2 10/30/17 21:32:34 25.23 -1.255780 21.8248 34.2364 -20.9051 47.4344 -2.071230  
    3 10/30/17 21:32:35 25.23 -0.769233 21.1590 30.5892 -20.9347 42.6061 -0.991607  
    4 10/30/17 21:32:36 25.23 -0.874262 21.3353 25.4841 -19.6127 38.3224 -0.452383  
    5 10/30/17 21:32:37 25.24 -0.819439 21.1916 21.4919 -16.5991 36.1331 -0.150002  
    6 10/30/17 21:32:38 25.24 -1.895730 21.5345 18.0576 -17.2539 31.7448 -0.311064   
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   acylam    7 年前

    那么,您可以执行以下操作:

    data$time_bucket <- 
      as.POSIXct(round(as.numeric(as.POSIXct(paste(data$Date, data$Time), format="%m/%d/%y %H:%M:%S"))/30)*30, origin='1970-01-01')
    

    1. as.POSIXct(paste(data$Date, data$Time), format="%m/%d/%y %H:%M:%S") 将日期和时间列粘贴在一起以创建一个“datetime”对象。
    2. as.numeric 将其转换为“epoch”number-自1970-01-01以来的秒数
    3. 除以30,取整并乘以30-这将创建30秒的桶。任何时候,四舍五入到同一个数字后,都会有相同的“标签”。
    4. 最后使用将其转换为“datetime” as.POSIXct .

    在完成所有这些之后,您只需按时间段取平均值,例如使用 dplyr :

    data %>% group_by(time_bucket) %>%
      summarize(mean(Temp))
    

    希望这能回答你的问题。

        2
  •  0
  •   acylam    7 年前

    下面是另一个解决方案 period.apply 从…起 xts :

    library(lubridate)
    library(xts)
    
    data_ts = as.xts(data[-c(1:2)], mdy_hms(paste(data$Date, data$Time)))
    
    ep = endpoints(data_ts, 'seconds', k = 30)
    
    period.apply(data_ts, ep, FUN = mean)
    

    结果:

                            Temp      Appb     Bppb     Cppb      Dppb    Eppb      Fppb
    2017-10-30 21:32:38 25.23333 -1.013958 21.58162 27.57642 -18.96497 41.3816 -1.153938
    

    由于所有样本数据都在30秒内,因此每列只能得到一个平均值。为了验证我的答案是否有效,您可以尝试2秒钟的平均值:

    test_ep = endpoints(data_ts, 'seconds', k = 2)
    
    period.apply(data_ts, test_ep, FUN = mean)
    

                          Temp       Appb     Bppb    Cppb     Dppb     Eppb       Fppb
    2017-10-30 21:32:33 25.230 -0.4693040 22.44450 35.5993 -18.4843 52.04880 -2.9473400
    2017-10-30 21:32:35 25.230 -1.0125065 21.49190 32.4128 -20.9199 45.02025 -1.5314185
    2017-10-30 21:32:37 25.235 -0.8468505 21.26345 23.4880 -18.1059 37.22775 -0.3011925
    2017-10-30 21:32:38 25.240 -1.8957300 21.53450 18.0576 -17.2539 31.74480 -0.3110640
    

    数据:

    data = read.table(text = "   Date     Time  Temp      Appb    Bppb    Cppb     Dppb    Eppb      Fppb
                      1 10/30/17 21:32:33 25.23 -0.469304 22.4445 35.5993 -18.4843 52.0488 -2.947340   
                      2 10/30/17 21:32:34 25.23 -1.255780 21.8248 34.2364 -20.9051 47.4344 -2.071230  
                      3 10/30/17 21:32:35 25.23 -0.769233 21.1590 30.5892 -20.9347 42.6061 -0.991607  
                      4 10/30/17 21:32:36 25.23 -0.874262 21.3353 25.4841 -19.6127 38.3224 -0.452383  
                      5 10/30/17 21:32:37 25.24 -0.819439 21.1916 21.4919 -16.5991 36.1331 -0.150002  
                      6 10/30/17 21:32:38 25.24 -1.895730 21.5345 18.0576 -17.2539 31.7448 -0.311064", 
                      header = TRUE, stringsAsFactors = FALSE)
    
        3
  •  0
  •   Gautam    7 年前

    这是一个 data.table lubridate 完整性方法。

    library(data.table)
    library(lubridate)
    
    dat <- read.table(text = "Date     Time  Temp      Appb    Bppb    Cppb     Dppb    Eppb      Fppb
                              1 10/30/17 21:32:33 25.23 -0.469304 22.4445 35.5993 -18.4843 52.0488 -2.947340   
                              2 10/30/17 21:32:34 25.23 -1.255780 21.8248 34.2364 -20.9051 47.4344 -2.071230  
                              3 10/30/17 21:32:35 25.23 -0.769233 21.1590 30.5892 -20.9347 42.6061 -0.991607  
                              4 10/30/17 21:32:36 25.23 -0.874262 21.3353 25.4841 -19.6127 38.3224 -0.452383  
                              5 10/30/17 21:32:37 25.24 -0.819439 21.1916 21.4919 -16.5991 36.1331 -0.150002  
                              6 10/30/17 21:32:38 25.24 -1.895730 21.5345 18.0576 -17.2539 31.7448 -0.311064   ",
                      header = T, stringsAsFactors = F)
    
    #convert to R date object 
    dat$tme <- as.POSIXct(strptime(paste(dat$Date, dat$Time), format = "%m/%d/%y %H:%M:%S"), tz = "America/Montreal")
    
    #convert to data.table
    dat <- as.data.table(dat)
    
    #drop Date and Time since we have an R date object now
    dat <- dat[,-c(1,2)]
    
    #result
    dat[, lapply(.SD, mean), .(tme = round_date(tme, "3 seconds"))]
    

    我四舍五入到3秒,因为样本数据都在30秒内(与上述答案相同)。

        tme     Temp      Appb     Bppb     Cppb      Dppb     Eppb       Fppb
    1: 2017-10-30 21:32:33 25.23000 -0.862542 22.13465 34.91785 -19.69470 49.74160 -2.5092850
    2: 2017-10-30 21:32:36 25.23333 -0.820978 21.22863 25.85507 -19.04883 39.02053 -0.5313307
    3: 2017-10-30 21:32:39 25.24000 -1.895730 21.53450 18.05760 -17.25390 31.74480 -0.3110640
    

    我个人更喜欢 数据桌子