进行以下转换的最佳方法是什么?这种转换有两个部分。第一个是将速度转换为每秒平均值。第二种是将分类列转换为多列——每个分类值一列,其中值是每秒出现的次数。例如:
输入(xts A):
Time(PosixCT), Observed Letter, Speed
2011/01/11 12:12:01.100,A,1
2011/01/11 12:12:01.200,A,2
2011/01/11 12:12:01.400,B,3
2011/01/11 12:12:01.800,C,4
2011/01/11 12:12:02.200,D,2
2011/01/11 12:12:02.200,A,7
输出:(xts B)
Time, A_Per_Second, B_Per_Second, C_Per_Second, D_Per_Second, Aggregate_Speed
2011/01/11 12:12:01,2,1,1,0,2.5
2011/01/11 12:12:02,1,0,0,1,4.5
我希望以不需要知道所有类别的方式来执行此操作。基本上,我试图在不丢失任何分类数据的情况下将时间折叠到每秒,并将数字数据汇总为每秒平均值。
最佳答案
我不经常使用时间序列格式的数据(即 xts
),所以我提供了一个使用 data.frame
中的数据的解决方案格式。
(另请注意,我已将此数据框的列名称更改为单个单词以使其更易于使用。我在此问题的末尾发布了我的数据框的结构。)
我使用两个包:
HMisc
为 trunc
POSIXt 类的方法 plyr
使用一些魔法来拆分、应用和组合数据 编码:
A <- as.data.frame(A)
library(Hmisc)
A$Date <- trunc(A$Date, units="secs")
A
library(plyr)
ddply(A, .(Date, Observed), summarise, Speed=mean(Speed))
结果与您指定的格式略有不同,但应该很容易将其改造成您要求的宽格式。
Date Observed Speed
1 2011-01-11 12:12:01 A 1.5
2 2011-01-11 12:12:01 B 3.0
3 2011-01-11 12:12:01 C 4.0
4 2011-01-11 12:12:02 A 7.0
5 2011-01-11 12:12:02 D 2.0
这是
dput
A的结果:A <- structure(list(Date = structure(list(sec = c(1, 1, 1, 1, 2, 2
), min = c(12L, 12L, 12L, 12L, 12L, 12L), hour = c(12L, 12L,
12L, 12L, 12L, 12L), mday = c(11L, 11L, 11L, 11L, 11L, 11L),
mon = c(0L, 0L, 0L, 0L, 0L, 0L), year = c(111L, 111L, 111L,
111L, 111L, 111L), wday = c(2L, 2L, 2L, 2L, 2L, 2L), yday = c(10L,
10L, 10L, 10L, 10L, 10L), isdst = c(0L, 0L, 0L, 0L, 0L, 0L
)), .Names = c("sec", "min", "hour", "mday", "mon", "year",
"wday", "yday", "isdst"), class = c("POSIXlt", "POSIXt"), tzone = c("",
"GMT", "BST")), Observed = structure(c(1L, 1L, 2L, 3L, 4L, 1L
), .Label = c("A", "B", "C", "D"), class = "factor"), Speed = c(1L,
2L, 3L, 4L, 2L, 7L)), .Names = c("Date", "Observed", "Speed"), row.names = c(NA,
-6L), class = "data.frame")
关于r - 将时间序列中的分类列扩展为多个每秒计数列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6790695/