首页 > 解决方案 > data.table 根据唯一 ID 的第一行和最后一行生成具有间隔的序列

问题描述

我有一个这样的数据表。我将如何为该 ID 号中具有相同时间的每一行生成一个步长为 0.25 的序列。我对 R 很陌生,并尝试做一些数据争论......

     id time
 1:  1   14
 2:  1   14
 3:  1   14
 4:  1   14
 5:  1   18
 6:  1   18
 7:  1   22
 8:  1   22
 9:  2    8
10:  2    8
11:  2    8
12:  2    8
13:  2   12
14:  2   15
15:  2   15
16:  2   15
17:  2   19
18:  2   19
19:  2   19
20:  2   19

我希望它是这样的

    id time new_time
 1:  1   14 14.00
 2:  1   14 14.25 
 3:  1   14 14.50 
 4:  1   14 14.75
 5:  1   18 18.00
 6:  1   18 18.25
 7:  1   22 22.00
 8:  1   22 22.25
 9:  2    8 8.00
10:  2    8 8.25
11:  2    8 8.50
12:  2    8 8.75
13:  2   12 12.00
14:  2   15 15.00
15:  2   15 15.25
16:  2   15 15.50
17:  2   19 19.00
18:  2   19 19.25
19:  2   19 19.50
20:  2   19 19.75

标签: rdata.tablesequence

解决方案


您可以使用我们设置为每个组大小的length.out参数(在下面的代码中,它是一个提供的特殊符号,请参阅)seqtime.Ndata.table?.N

DT[, new_time := seq(first(time), by = 0.25, length.out = .N)  , by=time][]
#    id time new_time
# 1:  1   14    14.00
# 2:  1   14    14.25
# 3:  1   14    14.50
# 4:  1   14    14.75
# 5:  1   18    18.00
# 6:  1   18    18.25
# 7:  1   22    22.00
# 8:  1   22    22.25
# 9:  2    8     8.00
#10:  2    8     8.25
#11:  2    8     8.50
#12:  2    8     8.75
#13:  2   12    12.00
#14:  2   15    15.00
#15:  2   15    15.25
#16:  2   15    15.50
#17:  2   19    19.00
#18:  2   19    19.25
#19:  2   19    19.50
#20:  2   19    19.75

另一种选择是rowid(和一些微积分)

DT[, new_time := time + (rowid(time) - 1L) * 0.25]

数据

library(data.table)
DT <- fread(text = "     id time
  1   14
  1   14
  1   14
  1   14
  1   18
  1   18
  1   22
  1   22
  2    8
  2    8
  2    8
  2    8
  2   12
  2   15
  2   15
  2   15
  2   19
  2   19
  2   19
  2   19")

推荐阅读