根据 R 中时间列中的秒值求和列值
Sum Column Values Based on Seconds value in a Time Column in R
我想了解如何根据 data.table
中时间列的秒值对列求和
例如,假设我有一个数据table如下:
Time | Inventory
----------------------------------------------
08-01-2001 11:50:12 | 5
08-01-2001 11:50:16 | 8
08-01-2001 11:50:17 | 2
08-01-2001 11:50:17 | 1
08-01-2001 11:50:19 | 10
08-01-2001 11:50:23 | 5
08-01-2001 11:50:23 | 9
08-01-2001 11:51:23 | 12
然后我希望能够根据 Time
列中的秒值对 Inventory
求和,这样我得到 data.table 如下:
Time | Inventory
----------------------------------------------
08-01-2001 11:50:12 | 5
08-01-2001 11:50:16 | 8
08-01-2001 11:50:17 | 3
08-01-2001 11:50:17 | 3
08-01-2001 11:50:19 | 10
08-01-2001 11:50:23 | 14
08-01-2001 11:50:23 | 14
08-01-2001 11:51:23 | 12
我试过使用 Aggregate()
函数的变体,但这些似乎总是删除重复的行,我不想这样做。有没有一种方法可以使用 data.table
或 xts
来执行此操作?提前致谢。
编辑:这是 dput
输出:
structure(list(Timecol = c("0008-01-20 00:00:00", "0008-01-20 00:00:00",
"0008-01-20 00:00:00", "0008-01-20 00:00:00", "0008-01-20 00:00:00",
"0008-01-20 00:00:00", "0008-01-20 00:00:00", "0008-01-20 00:00:00"
), ID = c("11", "11", "11", "11", "11", "11", "11", "11"), Inventorycol = c("5",
"8", "2", "1", "10", "5", "9", "12")), .Names = c("Timecol",
"ID", "Inventorycol"), row.names = c(NA, -8L), class = c("data.table",
"data.frame"), .internal.selfref = <pointer: 0x00000000028b0788>)
您可以使用ave
函数:
(dat$Sum=ave(dat$Inventory,dat$Time,FUN=sum))
Time Inventory Sum
1 08-01-2001 11:50:12 5 5
2 08-01-2001 11:50:16 8 8
3 08-01-2001 11:50:17 2 3
4 08-01-2001 11:50:17 1 3
5 08-01-2001 11:50:19 10 10
6 08-01-2001 11:50:23 5 14
7 08-01-2001 11:50:23 9 14
使用的数据:
dat=read.table(text="
Time | Inventory
08-01-2001 11:50:12 | 5
08-01-2001 11:50:16 | 8
08-01-2001 11:50:17 | 2
08-01-2001 11:50:17 | 1
08-01-2001 11:50:19 | 10
08-01-2001 11:50:23 | 5
08-01-2001 11:50:23 | 9",sep="|",h=T,stringsAsFactors=F)
您可以使用
dat[, Sum := sum(Inventory), by = Time]
# Time Inventory Sum
# 1: 08-01-2001 11:50:12 5 5
# 2: 08-01-2001 11:50:16 8 8
# 3: 08-01-2001 11:50:17 2 3
# 4: 08-01-2001 11:50:17 1 3
# 5: 08-01-2001 11:50:19 10 10
# 6: 08-01-2001 11:50:23 5 14
# 7: 08-01-2001 11:50:23 9 14
这里是你如何使用 xts
:
# create xts object:
dat=read.table(text="
Time | Inventory
08-01-2001 11:50:12 | 5
08-01-2001 11:50:16 | 8
08-01-2001 11:50:17 | 2
08-01-2001 11:50:17 | 1
08-01-2001 11:50:19 | 10
08-01-2001 11:50:23 | 5
08-01-2001 11:50:23 | 9",sep="|",h=T,stringsAsFactors=F)
dat[, "Time2"] <- as.POSIXct(dat[, "Time"], format = "%d-%m-%Y %H:%M:%S")
x <- xts(dat[, "Inventory"], order.by = dat[, "Time2"])
sum_with_inv <- function(y) {
Sum <- sum(y)
m <- merge(y, Sum)
m
}
y <- do.call(rbind, lapply(split(x, f = "seconds"), sum_with_inv))
y
# y Sum
# 2001-01-08 11:50:12 5 5
# 2001-01-08 11:50:16 8 8
# 2001-01-08 11:50:17 2 3
# 2001-01-08 11:50:17 1 3
# 2001-01-08 11:50:19 10 10
# 2001-01-08 11:50:23 5 14
# 2001-01-08 11:50:23 9 14
我想了解如何根据 data.table
中时间列的秒值对列求和例如,假设我有一个数据table如下:
Time | Inventory
----------------------------------------------
08-01-2001 11:50:12 | 5
08-01-2001 11:50:16 | 8
08-01-2001 11:50:17 | 2
08-01-2001 11:50:17 | 1
08-01-2001 11:50:19 | 10
08-01-2001 11:50:23 | 5
08-01-2001 11:50:23 | 9
08-01-2001 11:51:23 | 12
然后我希望能够根据 Time
列中的秒值对 Inventory
求和,这样我得到 data.table 如下:
Time | Inventory
----------------------------------------------
08-01-2001 11:50:12 | 5
08-01-2001 11:50:16 | 8
08-01-2001 11:50:17 | 3
08-01-2001 11:50:17 | 3
08-01-2001 11:50:19 | 10
08-01-2001 11:50:23 | 14
08-01-2001 11:50:23 | 14
08-01-2001 11:51:23 | 12
我试过使用 Aggregate()
函数的变体,但这些似乎总是删除重复的行,我不想这样做。有没有一种方法可以使用 data.table
或 xts
来执行此操作?提前致谢。
编辑:这是 dput
输出:
structure(list(Timecol = c("0008-01-20 00:00:00", "0008-01-20 00:00:00",
"0008-01-20 00:00:00", "0008-01-20 00:00:00", "0008-01-20 00:00:00",
"0008-01-20 00:00:00", "0008-01-20 00:00:00", "0008-01-20 00:00:00"
), ID = c("11", "11", "11", "11", "11", "11", "11", "11"), Inventorycol = c("5",
"8", "2", "1", "10", "5", "9", "12")), .Names = c("Timecol",
"ID", "Inventorycol"), row.names = c(NA, -8L), class = c("data.table",
"data.frame"), .internal.selfref = <pointer: 0x00000000028b0788>)
您可以使用ave
函数:
(dat$Sum=ave(dat$Inventory,dat$Time,FUN=sum))
Time Inventory Sum
1 08-01-2001 11:50:12 5 5
2 08-01-2001 11:50:16 8 8
3 08-01-2001 11:50:17 2 3
4 08-01-2001 11:50:17 1 3
5 08-01-2001 11:50:19 10 10
6 08-01-2001 11:50:23 5 14
7 08-01-2001 11:50:23 9 14
使用的数据:
dat=read.table(text="
Time | Inventory
08-01-2001 11:50:12 | 5
08-01-2001 11:50:16 | 8
08-01-2001 11:50:17 | 2
08-01-2001 11:50:17 | 1
08-01-2001 11:50:19 | 10
08-01-2001 11:50:23 | 5
08-01-2001 11:50:23 | 9",sep="|",h=T,stringsAsFactors=F)
您可以使用
dat[, Sum := sum(Inventory), by = Time]
# Time Inventory Sum
# 1: 08-01-2001 11:50:12 5 5
# 2: 08-01-2001 11:50:16 8 8
# 3: 08-01-2001 11:50:17 2 3
# 4: 08-01-2001 11:50:17 1 3
# 5: 08-01-2001 11:50:19 10 10
# 6: 08-01-2001 11:50:23 5 14
# 7: 08-01-2001 11:50:23 9 14
这里是你如何使用 xts
:
# create xts object:
dat=read.table(text="
Time | Inventory
08-01-2001 11:50:12 | 5
08-01-2001 11:50:16 | 8
08-01-2001 11:50:17 | 2
08-01-2001 11:50:17 | 1
08-01-2001 11:50:19 | 10
08-01-2001 11:50:23 | 5
08-01-2001 11:50:23 | 9",sep="|",h=T,stringsAsFactors=F)
dat[, "Time2"] <- as.POSIXct(dat[, "Time"], format = "%d-%m-%Y %H:%M:%S")
x <- xts(dat[, "Inventory"], order.by = dat[, "Time2"])
sum_with_inv <- function(y) {
Sum <- sum(y)
m <- merge(y, Sum)
m
}
y <- do.call(rbind, lapply(split(x, f = "seconds"), sum_with_inv))
y
# y Sum
# 2001-01-08 11:50:12 5 5
# 2001-01-08 11:50:16 8 8
# 2001-01-08 11:50:17 2 3
# 2001-01-08 11:50:17 1 3
# 2001-01-08 11:50:19 10 10
# 2001-01-08 11:50:23 5 14
# 2001-01-08 11:50:23 9 14