将宽数据帧收集为狭窄的数据,然后扩展以在R中创建临时行

问题描述 投票:0回答:1

我有一个带有两个日期/时间列的数据框:

            BeginTime             EndTime      Value
-----------------------------------------------------
1 2019-01-03 13:45:00     2019-01-03 17:30:00    41
2 2019-01-03 13:30:00     2019-01-03 14:30:00    20
3 2019-01-03 16:45:00     2019-01-03 19:00:00    23

我需要转换成这个:

       Time               Value
--------------------------------
 1 2019-01-03 13:45:00      41
 2 2019-01-03 14:00:00      41
 3 2019-01-03 14:15:00      41
 4 2019-01-03 14:30:00      41
 5 2019-01-03 14:45:00      41
 6 2019-01-03 15:00:00      41
 7 2019-01-03 15:15:00      41
 8 2019-01-03 13:30:00      20
 9 2019-01-03 13:45:00      20
10 2019-01-03 14:00:00      20
11 2019-01-03 14:15:00      20
12 2019-01-03 16:45:00      23

但不确定如何执行此操作。有什么建议么?

创建testdf的代码

testdf <- data.frame(c("2019-01-03 13:45:00", "2019-01-03 13:30:00", "2019-01-03 16:45:00"), 
                 c("2019-01-03 15:30:00", "2019-01-03 14:30:00", "2019-01-03 17:00:00"), 
                 c(41,20,23))
colnames(testdf) <-c("BeginTime", "EndTime", "Value")
testdf$BeginTime <- as.POSIXct(testdf$BeginTime)
testdf$EndTime <- as.POSIXct(testdf$EndTime)

((我知道最初可能有一种将列创建为POSIXct的方法,但这是可行的)

r
1个回答
0
投票
我们可以在两列之间使用seq,并为每个Beginning - End创建一个完整的15分钟间隔的列表,然后根据其长度使用rep来获取值,即]]

l1 <- Map(function(x, y)seq(x, y, by = '15 mins'), testdf$BeginTime, testdf$EndTime) data.frame(Time = do.call(c, l1), value = rep(testdf$Value, lengths(l1)))

给出,

Time value 1 2019-01-03 13:45:00 41 2 2019-01-03 14:00:00 41 3 2019-01-03 14:15:00 41 4 2019-01-03 14:30:00 41 5 2019-01-03 14:45:00 41 6 2019-01-03 15:00:00 41 7 2019-01-03 15:15:00 41 8 2019-01-03 15:30:00 41 9 2019-01-03 13:30:00 20 10 2019-01-03 13:45:00 20 11 2019-01-03 14:00:00 20 12 2019-01-03 14:15:00 20 13 2019-01-03 14:30:00 20 14 2019-01-03 16:45:00 23 15 2019-01-03 17:00:00 23
© www.soinside.com 2019 - 2024. All rights reserved.