我有一个包含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
依旧......
答案 0 :(得分:4)
这是一种替代方法,实际上需要X
计数(根据OP comment)。
首先,我们会确保X
具有正确的POSIXct
格式,以便我们可以正确操作(为方便起见,我在这里使用data.table
包)
library(data.table)
setDT(df)[, X := as.POSIXct(X, format = "%d/%m/%Y %R")]
然后,我们将汇总00
中30
或X
的每个累积分钟实例,同时汇总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))