You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取data.table中每年最早日期对应的行号?

问题:提取data.table中每年最早日期的行号

我有一个包含日期列的data.table:

> dat
          Var1  Var2
        <Date> <num>
 1: 2023-11-01 18.05
 2: 2023-12-01  4.65
 3: 2024-01-01 20.34
 4: 2024-02-01 21.71
 5: 2024-03-01 51.60
 6: 2024-04-01 55.54
 7: 2024-05-01 50.34
 8: 2024-06-01 45.90
 9: 2024-07-01 21.26
10: 2024-08-01 19.52

> dput(dat)
structure(list(Var1 = structure(c(19662, 19692, 19723, 19754, 
19783, 19814, 19844, 19875, 19905, 19936), class = "Date"), Var2 = c(18.05, 
4.65, 20.34, 21.71, 51.6, 55.54, 50.34, 45.9, 21.26, 19.52)), row.names = c(NA, 
-10L), class = c("data.table", "data.frame"))

需要生成一个包含每年最早日期所在行号的向量,期望结果:

> first.dates
[1] 1 3

解决方案

方法1:按年份分组提取首行行号

利用data.table的分组语法,直接从日期列提取年份,按年份分组后取每组的第一行行号(.I是data.table内置的行号变量):

library(data.table)
# 确保dat是data.table格式(若初始为data.frame可执行此转换)
setDT(dat)

# 提取每年最早日期的行号
first.dates <- dat[, .(row_num = .I[1]), by = .(year = year(Var1))]$row_num

运行后得到的first.dates即为c(1,3),符合预期。

方法2:先排序再提取(适配日期乱序场景)

如果原数据的日期未按时间顺序排列,需先按日期排序,再分组取首行行号:

# 先按日期排序,再分组提取首行行号
first.dates <- dat[order(Var1), .(row_num = .I[1]), by = .(year = year(Var1))]$row_num

关键说明

  • year(Var1):从Date类型的Var1列提取年份,data.table内置此函数,无需额外加载lubridate包。
  • .I:代表当前分组内的行号,.I[1]即每组的第一行行号。
  • by = .(year = year(Var1)):指定按提取的年份作为分组依据。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:52:44