基于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
中包含一列minute
12: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>