根据第一列

时间:2015-08-19 13:42:44

标签: r add

我有一个包含2个变量的数据框。第一列" X"用格式dd / mm / yyyy hh:mm表示日期和时间,第二列中的值" Y"是电表读数,每次5分钟后读取。现在我想添加每半个小时的值。例如

X                Y  
13/12/2014 12:00 1   
13/12/2014 12:05 2  
13/12/2014 12:10 1  
13/12/2014 12:15 2  
13/12/2014 12:20 2  
13/12/2014 12:25 1

最后我想把结果呈现为:

13/12/2014 12:00 9  
13/12/2014 12:30 12  

依旧......

3 个答案:

答案 0 :(得分:4)

这是一种替代方法,实际上需要X计数(根据OP comment)。

首先,我们会确保X具有正确的POSIXct格式,以便我们可以正确操作(为方便起见,我在这里使用data.table包)

library(data.table)
setDT(df)[, X := as.POSIXct(X, format = "%d/%m/%Y %R")]

然后,我们将汇总0030X的每个累积分钟实例,同时汇总Y并提取每个X的第一个值df[order(X), .(X = X[1L], Y = sum(Y)), by = cumsum(format(X, "%M") %in% c("00", "30"))] # cumsum X Y # 1: 0 2014-12-13 12:10:00 6 # 2: 1 2014-12-13 12:30:00 6 # 3: 2 2014-12-13 13:00:00 3 组。我制作了一个更复杂的数据集,以说明更复杂的情况(见下文)

df <- read.table(text = "X Y  
'13/12/2014 12:10' 1  
'13/12/2014 12:15' 2  
'13/12/2014 12:20' 2  
'13/12/2014 12:25' 1
'13/12/2014 12:30' 1
'13/12/2014 12:35' 1
'13/12/2014 12:40' 1
'13/12/2014 12:45' 1
'13/12/2014 12:50' 1
'13/12/2014 12:55' 1
'13/12/2014 13:00' 1
'13/12/2014 13:05' 1
'13/12/2014 13:10' 1", header = TRUE)

数据

by

一些解释

  • format(X, "%M")表达式:
    • X获取?strptime分钟(参见00
    • 检查下一步是否与30%in%匹配(使用cumsum
    • by将这些匹配的值分隔为单独的组,我们通过将此表达式放入?data.table语句来聚合(请参阅j
  • (X = X[1L], Y = sum(Y))次出现
    • X只是获得每组Y的第一个值,以及每个组i的总和。
  • order(X)表达式
    • 我已添加X以确保按日期正确排序数据集(我将POSIXct转换为正确的data.table的主要原因之一格式)

为了更好地了解log的工作原理,请参阅一些教程here

答案 1 :(得分:3)

Transition

t1 <- tapply(df$Y, as.numeric(as.POSIXct(df$X, format = '%d/%m/%Y %H:%M')) %/% 1800, sum) data.frame(time = as.POSIXct(as.numeric(names(t1))*1800 + 1800, origin = '1970-01-01'), t1) 使用整数除法将值分组1800(30分钟)

答案 2 :(得分:2)

将您的数据框架视为df。你可以尝试 -

unname(tapply(df$Y, (seq_along(df$Y)-1) %/% 6, sum))