r - 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
解决方案
您可以使用我们设置为每个组大小的length.out
参数(在下面的代码中,它是一个提供的特殊符号,请参阅)seq
time
.N
data.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")
推荐阅读
- html - 如何在背景颜色悬停更改上保持容器的边框半径?
- javascript - .then() 中的函数没有被调用
- salesforce - SOSL 搜索存档活动
- vba - 无法将时间戳格式化为 vba 中的日期
- python - 如何在同一情节中制作虚线和粗线
- javascript - Sequelize:如何从字段中返回特定值
- c# - 选择案例不适用于 Unity 中的 Text gameObject 比较字符串
- reactjs - ReactJs:SyntaxError - firefox 中的无效正则表达式组
- python - Django - 链接到来自不同应用程序的 URL 重定向到相同的链接
- c++ - Valgrind - 在程序退出时哪些指针被认为是有效的,以将内存标记为“仍然可以访问”?