如何获取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
相关产品推荐
相关产品推荐

