如何创建统计id与time组合出现次数的occurrence变量
问题描述
现有如下数据:
#id time #1 1 #1 2 #2 1 #2 2 #2 1 #2 2 #3 1 #3 2
需要创建一个occurrence变量,针对id与time的组合,首次出现标记为1,第二次出现标记为2,期望得到的结果如下:
#id time occurrence #1 1 1 #1 2 1 #2 1 1 #2 2 1 #2 1 2 #2 2 2 #3 1 1 #3 2 1
R语言实现
使用dplyr包的分组与行号函数即可实现:
library(dplyr) # 构造数据框 df <- data.frame( id = c(1,1,2,2,2,2,3,3), time = c(1,2,1,2,1,2,1,2) ) # 生成occurrence列 df <- df %>% group_by(id, time) %>% mutate(occurrence = row_number()) %>% ungroup() print(df)
按id和time分组后,row_number()会为每组内的行按出现顺序生成连续编号,正好匹配需求的标记规则。
Python(Pandas)实现
借助Pandas的分组与累计计数函数:
import pandas as pd # 构造数据框 df = pd.DataFrame({ 'id': [1,1,2,2,2,2,3,3], 'time': [1,2,1,2,1,2,1,2] }) # 生成occurrence列(cumcount从0开始,加1转为从1计数) df['occurrence'] = df.groupby(['id', 'time']).cumcount() + 1 print(df)
SQL实现
利用窗口函数ROW_NUMBER()完成分组编号:
SELECT id, time, ROW_NUMBER() OVER (PARTITION BY id, time ORDER BY (SELECT NULL)) AS occurrence FROM your_table_name;
PARTITION BY id, time按指定组合分组,ROW_NUMBER()为每组内的行生成顺序编号;ORDER BY (SELECT NULL)用于保留原始数据的行顺序,不同数据库可根据实际情况调整排序规则(比如MySQL可用ORDER BY 1)。
内容的提问来源于stack exchange,提问作者Victor Nielsen
相关产品推荐
相关产品推荐

