如何在R语言管道操作中基于不同时间维度创建变量
解决R语言管道中多时间维度统计的问题
情况1:原始数据每行对应一个物品
如果你的dataset里每行是一个单独的物品记录(包含group和month列),可以通过两次分组实现需求:
abc <- dataset %>% # 第一步:按group分组,计算每组全年总物品数,添加为新列 group_by(group) %>% mutate(TotItemsYear = n()) %>% # 第二步:保留group分组的同时,新增month分组 group_by(group, month, .add = TRUE) %>% summarize( TotItemsMonth = n(), # 统计每组每月的物品总量 TotItemsYear = first(TotItemsYear), # 同一组的全年总量一致,取第一个值即可 ratio = TotItemsMonth / TotItemsYear, # 计算目标比率 .groups = "drop" # 可选:取消分组,将结果转为普通数据框 )
情况2:原始数据已按组和月汇总
如果你的dataset是提前汇总好的格式(比如有item_count列表示某组某月的物品数量),只需把统计逻辑从计数改为求和:
abc <- dataset %>% group_by(group) %>% mutate(TotItemsYear = sum(item_count)) %>% group_by(group, month, .add = TRUE) %>% summarize( TotItemsMonth = sum(item_count), TotItemsYear = first(TotItemsYear), ratio = TotItemsMonth / TotItemsYear, .groups = "drop" )
另一种分步实现思路
要是觉得嵌套分组绕,也可以拆分步骤分别计算后合并:
# 计算每组每月的物品总量 monthly_data <- dataset %>% group_by(group, month) %>% summarize(TotItemsMonth = n(), .groups = "drop") # 计算每组全年的物品总量 yearly_data <- dataset %>% group_by(group) %>% summarize(TotItemsYear = n(), .groups = "drop") # 合并数据并计算比率 abc <- monthly_data %>% left_join(yearly_data, by = "group") %>% mutate(ratio = TotItemsMonth / TotItemsYear)
核心逻辑:全年总量是group级别的统计,必须先在group分组下计算,再传递到group+month的分组中,不能直接在group+month的分组里获取全年维度的统计值。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

