基于R中的函数在数据表中复制行
我有一个数据表,其中有一列用于事件的基于R中的函数在数据表中复制行,r,data.table,R,Data.table,我有一个数据表,其中有一列用于事件的开始时间。我需要在7am和开始时间之间每分钟复制一次表 我还需要为每个重复的数据集添加一个新的列,如果7am和开始时间之间有10分钟,数据集将重复10次。第一组显示上午7:01,下一组显示上午7:02,以此类推,最后一组显示的时间与开始时间相同 我目前正在做两个循环,但速度非常慢 dt <- data.table(id = c(1, 1, 1, 2, 2, 2, 3, 3, 3), time = c(rep("
开始时间。我需要在7am
和开始时间之间每分钟复制一次表
我还需要为每个重复的数据集添加一个新的列,如果7am
和开始时间之间有10分钟,数据集将重复10次。第一组显示上午7:01,下一组显示上午7:02,以此类推,最后一组显示的时间与开始时间相同
我目前正在做两个循环,但速度非常慢
dt <- data.table(id = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
time = c(rep("2020-07-23 12:00:00 BST", 3), rep("2020-07-23 12:10:00 BST", 3), rep("2020-07-23 12:20:00 BST", 3)),
h = c("a", "b", "c", "d", "e", "f", "g", "h", "i"))
s <- data.table(NULL)
fs <- data.table(NULL)
ids <- unique(dt$id)
start_time <- strptime(paste0(lubridate::ymd(Sys.Date()), " 11:50:00"), "%Y-%m-%d %H:%M:%S")
for (i in seq_along(ids)) {
d <- dt[id == ids[i]]
diff_minutes <- as.numeric(difftime(max(d$time), start_time, units='mins'))
for (j in 1:diff_minutes) {
ref_time <- start_time + (j * 60)
d[, time_stamp := ref_time]
d[, time_stamp_hour := substr(time_stamp, 12, 19)]
s <- rbindlist(list(s, d), use.names = T, fill = T)
}
fs <- rbindlist(list(fs, s))
s <- data.table(NULL)
}
dt更新
让我们试试:
> dt[, min_seq := lapply(as.POSIXct(time), function(end) seq(start_time,end, by = "mins"))]
> res <- dt[ , list( mins = do.call("unlist", min_seq) ) , by = .(id,time,h) ]
> res[, mins2 := substr(mins, 12, 16)]
> head(res)
id time h mins mins2
1: 1 2020-07-23 12:00:00 BST a 2020-07-23 11:50:00 11:50
2: 1 2020-07-23 12:00:00 BST a 2020-07-23 11:51:00 11:51
3: 1 2020-07-23 12:00:00 BST a 2020-07-23 11:52:00 11:52
4: 1 2020-07-23 12:00:00 BST a 2020-07-23 11:53:00 11:53
5: 1 2020-07-23 12:00:00 BST a 2020-07-23 11:54:00 11:54
6: 1 2020-07-23 12:00:00 BST a 2020-07-23 11:55:00 11:55
> tail(res)
id time h mins mins2
1: 3 2020-07-23 12:20:00 BST i 2020-07-23 12:15:00 12:15
2: 3 2020-07-23 12:20:00 BST i 2020-07-23 12:16:00 12:16
3: 3 2020-07-23 12:20:00 BST i 2020-07-23 12:17:00 12:17
4: 3 2020-07-23 12:20:00 BST i 2020-07-23 12:18:00 12:18
5: 3 2020-07-23 12:20:00 BST i 2020-07-23 12:19:00 12:19
6: 3 2020-07-23 12:20:00 BST i 2020-07-23 12:20:00 12:20
> str(res)
Classes ‘data.table’ and 'data.frame': 189 obs. of 5 variables:
$ id : num 1 1 1 1 1 1 1 1 1 1 ...
$ time : chr "2020-07-23 12:00:00 BST" "2020-07-23 12:00:00 BST" "2020-07-23 12:00:00 BST" "2020-07-23 12:00:00 BST" ...
$ h : chr "a" "a" "a" "a" ...
$ mins : POSIXct, format: "2020-07-23 11:50:00" "2020-07-23 11:51:00" "2020-07-23 11:52:00" "2020-07-23 11:53:00" ...
$ mins2: chr "11:50" "11:51" "11:52" "11:53" ...
- attr(*, ".internal.selfref")=<externalptr>
我认为这不太管用start\u time
是进程实际开始运行的时间,表中的time
列是事件开始的时间。我需要从表中的开始时间
到时间
的时间顺序。我使用了11:50
来减小这个示例的大小。然后,您提到的start\u time
不是start\u time
而是time
列。你需要“复制”表格吗?那么,您是否希望示例中的9行dt
中包含一列minute12:15
。或者仅仅是最后三行,因为前六行在12:15
之前有time
?你能澄清你的问题吗?如果你看到我的例子,id 1有3行,时间是开始时间之后10分钟。因此,该组重复10次,从开始时间到时间,每组内的时间间隔为1分钟。id 2在10分钟后开始,因此每个组将重复20次,每个组将以1分钟的间隔从开始时间
上升到时间
,依此类推。@Midnight Datageek I更新了答案。看一看@MidnightDataGeek我删除了我以前的评论,因为我本地化了它是由错误生成的。
> seqmin <- seq(as.POSIXct(strptime(paste0(substr(start_time,1,10)," 07:00:00"), "%Y-%m-%d %H:%M:%S")), start_time, by = "mins")
> seqmin <- substr(seqmin, 12,16)
> seqmin <- data.table(seqmin)
> res <- setkey(dt[,c(k=1,.SD)],k)[seqmin[,c(k=1,.SD)],allow.cartesian=TRUE][,k:=NULL]
> head(res)
id time h seqmin
1: 1 2020-07-23 12:00:00 BST a 07:00
2: 1 2020-07-23 12:00:00 BST b 07:00
3: 1 2020-07-23 12:00:00 BST c 07:00
4: 2 2020-07-23 12:10:00 BST d 07:00
5: 2 2020-07-23 12:10:00 BST e 07:00
6: 2 2020-07-23 12:10:00 BST f 07:00
> tail(res)
id time h seqmin
1: 2 2020-07-23 12:10:00 BST d 11:50
2: 2 2020-07-23 12:10:00 BST e 11:50
3: 2 2020-07-23 12:10:00 BST f 11:50
4: 3 2020-07-23 12:20:00 BST g 11:50
5: 3 2020-07-23 12:20:00 BST h 11:50
6: 3 2020-07-23 12:20:00 BST i 11:50
> str(res)
Classes ‘data.table’ and 'data.frame': 2619 obs. of 4 variables:
$ id : num 1 1 1 2 2 2 3 3 3 1 ...
$ time : chr "2020-07-23 12:00:00 BST" "2020-07-23 12:00:00 BST" "2020-07-23 12:00:00 BST" "2020-07-23 12:10:00 BST" ...
$ h : chr "a" "b" "c" "d" ...
$ seqmin: chr "07:00" "07:00" "07:00" "07:00" ...
- attr(*, ".internal.selfref")=<externalptr>