根据第一列的日期和时间添加第二列的值
Adding the values of second column based on date and time of first column
我有一个包含 2 个变量的数据框。第一列"X"表示日期和时间,格式为dd/mm/yyyyhh: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
等等...
正在将您的数据框视为 df
。你可以试试 -
unname(tapply(df$Y, (seq_along(df$Y)-1) %/% 6, sum))
这是另一种方法,实际上需要 X
计数(根据 )。
首先,我们将确保 X
是正确的 POSIXct
格式,以便我们可以正确地操作它(为了方便,我在这里使用 data.table
包)
library(data.table)
setDT(df)[, X := as.POSIXct(X, format = "%d/%m/%Y %R")]
然后,我们将在 X
内按累计分钟数聚合 00
或 30
的实例,同时对 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
的工作原理,请参阅一些教程 here
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)
t1
使用整数除以 1800(30 分钟)对值进行分组
我有一个包含 2 个变量的数据框。第一列"X"表示日期和时间,格式为dd/mm/yyyyhh: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
等等...
正在将您的数据框视为 df
。你可以试试 -
unname(tapply(df$Y, (seq_along(df$Y)-1) %/% 6, sum))
这是另一种方法,实际上需要 X
计数(根据
首先,我们将确保 X
是正确的 POSIXct
格式,以便我们可以正确地操作它(为了方便,我在这里使用 data.table
包)
library(data.table)
setDT(df)[, X := as.POSIXct(X, format = "%d/%m/%Y %R")]
然后,我们将在 X
内按累计分钟数聚合 00
或 30
的实例,同时对 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
的工作原理,请参阅一些教程 here
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)
t1
使用整数除以 1800(30 分钟)对值进行分组