R 如何将每5个连续值重塑为一行并追加datetime?
我有一个传感器,每秒记录一些值,其中5个值的系列是一个测量值 以下是示例数据:R 如何将每5个连续值重塑为一行并追加datetime?,r,date,matrix,R,Date,Matrix,我有一个传感器,每秒记录一些值,其中5个值的系列是一个测量值 以下是示例数据: sensor<-c(1,2,3,4,5,1.1,2.1,3.2,4.2,5.1,1.2,2.2,3.1,4.3,5.4,1.1,2.22,3.3,4.9,5.55) clock<-seq(from=as.POSIXct("2010-03-01 13:02:00"),to=as.POSIXct("2010-05-05 13:10:00"),by="1 sec") time<-clock[1
sensor<-c(1,2,3,4,5,1.1,2.1,3.2,4.2,5.1,1.2,2.2,3.1,4.3,5.4,1.1,2.22,3.3,4.9,5.55)
clock<-seq(from=as.POSIXct("2010-03-01 13:02:00"),to=as.POSIXct("2010-05-05 13:10:00"),by="1 sec")
time<-clock[1:length(sensor)]
orig<-data.frame(sensor,time)
orig
sensor time
1 1.00 2010-03-01 13:02:00
2 2.00 2010-03-01 13:02:01
3 3.00 2010-03-01 13:02:02
4 4.00 2010-03-01 13:02:03
5 5.00 2010-03-01 13:02:04
6 1.10 2010-03-01 13:02:05
7 2.10 2010-03-01 13:02:06
8 3.20 2010-03-01 13:02:07
当我尝试将数据放入矩阵形式时:
clock2<-seq(from=as.POSIXct("2010-03-01 13:02:00"),to=as.POSIXct("2010-05-05 13:10:00"),by="5 sec")
tx<-t(matrix(sensor,5,4))
newd<-cbind(tx,clock2[1:nrow(tx)])
newd
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1.0 2.00 3.0 4.0 5.00 1267444920
[2,] 1.1 2.10 3.2 4.2 5.10 1267444920
[3,] 1.2 2.20 3.1 4.3 5.40 1267444920
[4,] 1.1 2.22 3.3 4.9 5.55 1267444920
clock2OP已请求对数据进行整形,以使构成一个测量值的5个连续传感器值显示在一行中。此外,将附加测量周期结束的时间
如前所述,矩阵
在这里不起作用,因为矩阵
只能容纳一个类。因此,我们需要使用一个data.frame
对象,它可以容纳5个数字列和一个类POSIXct
列
对于重塑,使用dcast()
函数:
library(data.table)
dcast(setDT(orig)[, rn := .I - 1L],
(time[5L * rn %/% 5L + 1L] + 5) ~ paste0("V", rn %% 5L + 1L),
value.var = "sensor")
或者,可以使用lubridate
包中的floor\u date()
来避免索引算法:
dcast(setDT(orig)[, rn := .I - 1L],
lubridate::floor_date(time + 5, unit = " 5 second") ~ paste0("V", rn %% 5L + 1L),
value.var = "sensor")
资料
sensormatrix
只能容纳单个类,因此它强制为单个类。使用data.frame
或list
使用newd请让问题标题反映问题。
time V1 V2 V3 V4 V5
1: 2010-03-01 13:02:05 1.0 2.00 3.0 4.0 5.00
2: 2010-03-01 13:02:10 1.1 2.10 3.2 4.2 5.10
3: 2010-03-01 13:02:15 1.2 2.20 3.1 4.3 5.40
4: 2010-03-01 13:02:20 1.1 2.22 3.3 4.9 5.55
dcast(setDT(orig)[, rn := .I - 1L],
lubridate::floor_date(time + 5, unit = " 5 second") ~ paste0("V", rn %% 5L + 1L),
value.var = "sensor")
sensor <- c(1, 2, 3, 4, 5, 1.1, 2.1, 3.2, 4.2, 5.1, 1.2, 2.2, 3.1, 4.3, 5.4, 1.1, 2.22, 3.3, 4.9, 5.55)
time <- seq(from = as.POSIXct("2010-03-01 13:02:00"), length.out = length(sensor), by = "1 sec")
orig <- data.frame(sensor, time)