如何为含Date与ID的DataFrame按日期生成Attempt计数列
按ID分组并按日期排序生成尝试次数列
你需要为每个ID按日期顺序标记尝试次数,以下是两种可行的解决方案:
示例数据
ID <- c(1,2,5,8,4,9,1,11,15,32,54,1,4,2,14) Date <- c("2021-04-12", "2021-04-12", "2021-04-13", "2021-04-14", "2021-04-19", "2021-04-19", "2021-04-20", "2021-04-21", "2021-04-22", "2021-04-28", "2021-04-28", "2021-04-29", "2021-04-29", "2021-05-06", "2021-05-07") Data <- data.frame(ID, Date) Data$Date <- as.Date(Data$Date, format="%Y-%m-%d")
方法一:Base R 实现
使用ave()函数按ID分组,结合rank()按日期排序生成序号:
Data$Attempt <- ave(as.numeric(Data$Date), Data$ID, FUN = function(x) rank(x, ties.method = "first"))
ave()按ID分组处理每个组的日期数据rank(..., ties.method = "first")确保即使存在相同日期,也会按记录出现顺序分配序号,完全匹配你需要的计数逻辑
方法二:dplyr 实现(更直观)
如果习惯使用tidyverse工具,用分组排序后生成行号的方式:
library(dplyr) Data <- Data %>% group_by(ID) %>% # 按ID分组 arrange(Date, .by_group = TRUE) %>% # 组内按日期排序 mutate(Attempt = row_number()) %>% # 生成组内序号 ungroup() # 取消分组
这种方式逻辑清晰,步骤明确,适合需要多步数据处理的场景。
执行后查看Data,Attempt列会和你期望的结果完全一致:
# 期望的Attempt列:c(1,1,1,1,1,1,2,1,1,1,1,3,2,2,1)
内容的提问来源于stack exchange,提问作者blake.struthers
相关产品推荐
相关产品推荐

