【发布时间】:2018-04-13 08:25:31
【问题描述】:
我正在尝试这样的事情
df <- data.frame(times = c("0915", "0930", "0945", "1000", "1015", "1030", "1045", "1100", "1130", "1145", "1200"),
values = c(1,2,3,4,1,2,3,4,1,3,4))
> df
times values
1 0915 1
2 0930 2
3 0945 3
4 1000 4
5 1015 1
6 1030 2
7 1045 3
8 1100 4
9 1130 1
10 1145 3
11 1200 4
12 1215 1
13 1245 3
14 1300 4
15 1330 2
16 1345 4
然后把它变成这样的东西
> df2
times values
1 0930 3
2 1000 7
3 1030 3
4 1100 7
5 1130 NA
6 1200 7
7 1230 NA
8 1300 7
9 1330 NA
10 1400 NA
基本上,获取以 15 分钟为间隔测量的值,并将它们转换为以 30 分钟为间隔测量的值(相加就足够了)。
如果我可以确定每半小时阅读两次 15 分钟的读数,我可以想出一个好的解决方案。我可以成对添加元素并得到我想要的。但我无法在我的数据集中确定这一点。正如我的演示还显示的那样,可能缺少多个连续的值。
所以我认为某种数字识别是必要的,例如识别出时间在 9:15 和 9:30 之间,并将这两者相加。所以我已经创建了一个名为 hr2dec 的函数来将这些时间转换为十进制,所以它看起来像这样
> hr2dec(df$times)
[1] 9.25 9.50 9.75 10.00 10.25 10.50 10.75 11.00 11.50 11.75 12.00
我提到这一点是为了用十进制而不是 4 位时间更容易解决这个问题。
我也有 24 小时和多天的数据。因此,如果我有一个循环的解决方案,它需要在2400 之后重置为0015,因为这些是每天的第一次和最后一次测量。可以像这样生成包含日期的完整数据集(使用小数表示时间,就像我说的那样,对我来说都可以):
set.seed(42)
full_df <- data.frame(date = rep(as.Date(c("2010-02-02", "2010-02-03")), each = 96),
dec_times = seq(0.25,24,0.25),
values = rnorm(96)
)
full_df <- full_df[-c(2,13,15,19,95,131,192),]
到目前为止,我能想到的最佳解决方案是成对比较循环。但即使这样也不完美。
有什么优雅的方式来做我所追求的吗? IE。检查第一个和最后一个值(就日期和时间而言),并计算每半小时的间隔?我对我的循环不满意...
- 检查第一个和最后一个日期时间值以计算出半小时的范围
- 按顺序检查项目,一次配对以决定我是否有两个属于该半小时周期的值。
- 如果我这样做,则求和,如果我不这样做,则为 NA。
【问题讨论】:
-
我建议您通过包含所有案例来改进您的可重现示例。例如,您在文中提到的午夜时间段。
-
好建议@Seymour。我已经删除了 2010-02-02 的 2345 时间段,这样第一天的午夜就会变成 NA。
-
此外,我并不太关心最后的案例,因为我总是可以通过检查来抵消我从有效数据开始的任何解决方案。
标签: r