1

我有一个按日期时间列排序的日期框架,其中包括单个日期时间戳的多行。我想将每个单独的时间戳压缩成一行。数据框包含许多数据列,其中一些仅在时间戳更改时更改,但是,即使在唯一时间戳(例如 c1a-c2b)内,也有其他列在每一行上具有唯一值。对于这些列,我想在我的数据集中为所有已压缩为一个的行得到一个总和值(注意:每个唯一日期时间戳的行数各不相同)。

示例数据:

Data <- structure(list(datetime = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L), .Label = c("01/04/2011 00:13", "31/03/2011 23:14"
), class = "factor"), dist = c(210L, 210L, 210L, 210L, 210L, 
210L, 210L, 210L, 210L, 210L, 210L, 210L, 210L, 210L, 210L, 210L, 
210L, 210L, 210L, 210L, 215L, 215L, 215L, 215L, 215L, 215L, 215L, 
215L, 215L, 215L, 215L, 215L, 215L, 215L, 215L, 215L, 215L, 215L, 
215L, 215L, 215L, 215L, 215L), n = c(8L, 8L, 8L, 8L, 8L, 8L, 
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L), c1a = c(184L, 184L, 200L, 200L, 200L, 220L, 
220L, 220L, 220L, 220L, 220L, 220L, 220L, 220L, 220L, 200L, 200L, 
200L, 200L, 200L, 200L, 200L, 200L, 200L, 100L, 100L, 100L, 100L, 
100L, 100L, 100L, 100L, 100L, 100L, 70L, 70L, 70L, 70L, 70L, 
70L, 70L, 70L, 70L), c1b = c(18.4, 18.4, 20, 20, 20, 22, 22, 
22, 22, 22, 22, 22, 22, 22, 22, 20, 20, 20, 20, 20, 20, 20, 20, 
20, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 7, 
7, 7, 7), c2a = c(552L, 552L, 600L, 600L, 600L, 660L, 660L, 660L, 
660L, 660L, 660L, 660L, 660L, 660L, 660L, 600L, 600L, 600L, 600L, 
600L, 600L, 600L, 600L, 600L, 300L, 300L, 300L, 300L, 300L, 300L, 
300L, 300L, 300L, 300L, 210L, 210L, 210L, 210L, 210L, 210L, 210L, 
210L, 210L), c2b = c(55.2, 55.2, 60, 60, 60, 66, 66, 66, 66, 
66, 66, 66, 66, 66, 66, 60, 60, 60, 60, 60, 60, 60, 60, 60, 30, 
30, 30, 30, 30, 30, 30, 30, 30, 30, 21, 21, 21, 21, 21, 21, 21, 
21, 21)), .Names = c("datetime", "dist", "n", "c1a", "c1b", "c2a", 
"c2b"), class = "data.frame", row.names = c(NA, -43L))

像这样读入:

datetime            dist    n   c1a c1b     c2a c2b
31/03/2011 23:14    210     8   184 18.4    552 55.2
31/03/2011 23:14    210     8   184 18.4    552 55.2
31/03/2011 23:14    210     8   200 20      600 60       etc...

在我的输出数据框中,我还希望得到一个新列,其中列出了原始日期框架中每个唯一日期时间戳的行数。

我想结束的例子:

 dt1               dist  n  c1a     c1b     c2a     c2b     row_sum
 31/03/2011 23:14   210  8  4168    416.8   12504   1250.4  20
 01/04/2011 00:13   215  5  2430    243     7290    729     23

我看过类似的功能,to.period但它们并不完全符合我的要求。我将不胜感激任何建议。谢谢。

4

2 回答 2

3
Data$datetime <- as.POSIXct(Data$datetime,format="%d/%m/%Y %H:%M",tz="GMT")

library(plyr)
ddply(Data,.(datetime,dist,n),summarise,
      c1a = sum(c1a),
      c1b = sum(c1b),
      c2a = sum(c2a),
      c2b = sum(c2b),
      row_sum = length(dist))

#             datetime dist n  c1a   c1b   c2a    c2b row_sum
#1 2011-03-31 23:14:00  210 8 4168 416.8 12504 1250.4      20
#2 2011-04-01 00:13:00  215 5 2430 243.0  7290  729.0      23
于 2013-07-08T12:36:29.660 回答
2

您可以使用 data.table 来做到这一点

require(data.table)
Data <- as.data.table(Data)
setkeyv(Data, c("datetime", "dist", "n"))
Data[ ,c(lapply(.SD, sum), list(row_sum = .N)), by = "datetime,dist,n"]
##            datetime dist n  c1a   c1b   c2a    c2b row_sum
## 1: 01/04/2011 00:13  215 5 2430 243.0  7290  729.0      23
## 2: 31/03/2011 23:14  210 8 4168 416.8 12504 1250.4      20
于 2013-07-08T12:36:47.173 回答