为 R 中的每个 ID 生成日期和时间序列
Generate Sequence of Dates and Time for each ID in R
我正在尝试找出以这种格式创建日期和时间序列的方法:2018-01-01 01:00 到 2018-03-30 01:00
对于每个 Patient 并用随机数填充新的空值。
我的数据如下:
Patients temperature
Patient1 37
Patient2 36
Patient3 35.4
我想让数据看起来像
Patients temperature Time
Patient1 37 2018-01-01 01:00
Patient2 36 2018-01-01 01:00
Patient3 35.4 2018-01-01 01:00
Patient1 NA 2018-01-01 02:00
Patient2 NA 2018-01-01 02:00
Patient3 NA 2018-01-01 02:00
Patient1 NA 2018-01-01 03:00
Patient2 NA 2018-01-01 03:00
Patient3 NA 2018-01-01 03:00
所以时间变量将持续到 2018-03-30 01:00 并且温度可以是 NA 然后我生成随机数但不重复每个患者的相同温度值。
我试过这个命令但没有用,我不知道如何为每个患者分配时间
Time <- seq (from=as.POSIXct("2018-1-1 01:00"), to=as.POSIXct("2018-3-30 01:00", tz="UTC"), by="hour")
我也试过这个命令,但我收到错误消息:
dt = data.table(ID = Sensor7$StationID,Time = seq (from=as.POSIXct("2018-01-01 02:00"), to=as.POSIXct("2018-03-30 01:00",format = "%Y-%m-%d %H:%M",by="hour")))
但是它给了我错误信息:
Error in seq.POSIXt(from = as.POSIXct("2018-01-01 00:00"), to = as.POSIXct("2018-03-30 23:00", :
exactly two of 'to', 'by' and 'length.out' / 'along.with' must be specified
有谁知道如何以我正在寻找的格式获取数据?
这是一种方法:
dat = data.frame(Patients=paste0("Patients", 1:3), temperature=c(37,36,35.4))
Time = seq(as.POSIXct("2018-01-01 01:00"), as.POSIXct("2018-03-30 01:00"), by="hour")
new.data = data.frame(
Patient = rep(dat$Patients, each=length(Time)),
Time = rep(Time, length(dat$Patients))
)
我不确定你想如何生成随机值,但这里有一个通用方法:
new.data$Random.Temperature = rnorm(nrow(new.data), 35, 1)
你离得不远。试试这个:
# I reproduce your data:
library(data.table)
data = data.table::fread(input =
"Patients,temperature
Patient1,37
Patient2,36
Patient3,35.4")
library(dplyr)
Time <- seq (from=as.POSIXct("2018-1-1 01:00"), to=as.POSIXct("2018-3-30 01:00", tz="UTC"), by="hour")
这应该可以满足您的要求:
data %>%
group_by(Patients) %>%
do({data.frame("temperature" = c(.data$temperature, rep(NA,length(Time) - nrow(.data))), Time)})
我正在尝试找出以这种格式创建日期和时间序列的方法:2018-01-01 01:00 到 2018-03-30 01:00 对于每个 Patient 并用随机数填充新的空值。
我的数据如下:
Patients temperature
Patient1 37
Patient2 36
Patient3 35.4
我想让数据看起来像
Patients temperature Time
Patient1 37 2018-01-01 01:00
Patient2 36 2018-01-01 01:00
Patient3 35.4 2018-01-01 01:00
Patient1 NA 2018-01-01 02:00
Patient2 NA 2018-01-01 02:00
Patient3 NA 2018-01-01 02:00
Patient1 NA 2018-01-01 03:00
Patient2 NA 2018-01-01 03:00
Patient3 NA 2018-01-01 03:00
所以时间变量将持续到 2018-03-30 01:00 并且温度可以是 NA 然后我生成随机数但不重复每个患者的相同温度值。
我试过这个命令但没有用,我不知道如何为每个患者分配时间
Time <- seq (from=as.POSIXct("2018-1-1 01:00"), to=as.POSIXct("2018-3-30 01:00", tz="UTC"), by="hour")
我也试过这个命令,但我收到错误消息:
dt = data.table(ID = Sensor7$StationID,Time = seq (from=as.POSIXct("2018-01-01 02:00"), to=as.POSIXct("2018-03-30 01:00",format = "%Y-%m-%d %H:%M",by="hour")))
但是它给了我错误信息:
Error in seq.POSIXt(from = as.POSIXct("2018-01-01 00:00"), to = as.POSIXct("2018-03-30 23:00", :
exactly two of 'to', 'by' and 'length.out' / 'along.with' must be specified
有谁知道如何以我正在寻找的格式获取数据?
这是一种方法:
dat = data.frame(Patients=paste0("Patients", 1:3), temperature=c(37,36,35.4))
Time = seq(as.POSIXct("2018-01-01 01:00"), as.POSIXct("2018-03-30 01:00"), by="hour")
new.data = data.frame(
Patient = rep(dat$Patients, each=length(Time)),
Time = rep(Time, length(dat$Patients))
)
我不确定你想如何生成随机值,但这里有一个通用方法:
new.data$Random.Temperature = rnorm(nrow(new.data), 35, 1)
你离得不远。试试这个:
# I reproduce your data:
library(data.table)
data = data.table::fread(input =
"Patients,temperature
Patient1,37
Patient2,36
Patient3,35.4")
library(dplyr)
Time <- seq (from=as.POSIXct("2018-1-1 01:00"), to=as.POSIXct("2018-3-30 01:00", tz="UTC"), by="hour")
这应该可以满足您的要求:
data %>%
group_by(Patients) %>%
do({data.frame("temperature" = c(.data$temperature, rep(NA,length(Time) - nrow(.data))), Time)})