gpt4 book ai didi

r - 在 data.table 中按组标记第一行

转载 作者:行者123 更新时间:2023-12-05 09:00:38 25 4
gpt4 key购买 nike

在下面的 data.table 中,我想按每个组标记第一行。

  temp_dt <- data.table(date = as.Date(c("2000-01-01","2000-03-31","2000-07-01","2000-09-30", 
"2001-01-01","2001-03-31","2001-07-01","2001-09-30",
"2000-01-01","2000-03-31","2000-07-01","2000-09-30",
"2001-01-01","2001-03-31","2001-07-01","2001-09-30",
"2000-01-01","2000-03-31","2000-07-01","2000-09-30",
"2001-01-01","2001-03-31","2001-07-01","2001-09-30")),
group = c(1,1,1,1,1,1,1,1,
2,2,6,6,6,8,8,8,
3,3,3,3,4,4,4,4))

以下是添加标志后的预期结果。

> temp_dt
date group flag
1: 2000-01-01 1 1
2: 2000-03-31 1 0
3: 2000-07-01 1 0
4: 2000-09-30 1 0
5: 2001-01-01 1 0
6: 2001-03-31 1 0
7: 2001-07-01 1 0
8: 2001-09-30 1 0
9: 2000-01-01 2 1
10: 2000-03-31 2 0
11: 2000-07-01 6 1
12: 2000-09-30 6 0
13: 2001-01-01 6 0
14: 2001-03-31 8 1
15: 2001-07-01 8 0
16: 2001-09-30 8 0
17: 2000-01-01 3 1
18: 2000-03-31 3 0
19: 2000-07-01 3 0
20: 2000-09-30 3 0
21: 2001-01-01 4 1
22: 2001-03-31 4 0
23: 2001-07-01 4 0
24: 2001-09-30 4 0
date group flag

这是我尝试过的解决方案(速度很快),但没有按预期工作。

temp_dt[, flag := if(identical(.I, 1)) 1 else 0, by = .(group)]

由于我要处理数百万行,因此性能是解决方案的关键。我正在寻找唯一的 data.table 解决方案。

SO 上提供的其他解决方案对于我的要求来说太慢了。

最佳答案

您可以使用rowid 函数。它将为给定分组变量定义的每个组提供从 1 开始的增量索引。只需与 1 进行比较即可检测第一行。

temp_dt[, flag := rowid(group)==1]

作为检测组最后一行的奖励(.N 代表当前组的行数)

temp_dt[, flag := rowid(group)==.N]

关于r - 在 data.table 中按组标记第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75296475/

25 4 0