如何用group_map处理分组数据集:非首行观测值递减生成新列
问题解决:分组数据生成递减滞后列
问题分析
你当前的代码存在两个核心问题:
- 分组依据错误:你按
value分组,但需求是基于业务分组(如示例中的problems或category_problems)计算组内的滞后值,同一value可能属于不同业务分组,不能混为一谈。 - 数据处理方式错误:
group_map会返回拆分后的分组结果列表,无法保留原数据框结构并添加新列,应该使用mutate结合分组上下文完成计算。
修正后的代码
library(tidyverse) # 示例数据 test = tibble( problems = c("money", "money", "money", "food", "food", "bills", "bills"), category_problems = c("financial insecurity", "financial insecurity", "financial insecurity", "cost of living", "cost of living", "financial insecurity", "financial insecurity"), value = c(3, 3, 3, 2, 2, 1, 1) ) # 修正自定义函数:利用分组上下文计算组内行号 lag.values = function(x) { case_when( row_number() == 1 ~ x, # 组内首行保留原value TRUE ~ lag(x) - 1e-6 # 非首行取前一行value减0.000001 ) } # 按业务分组(这里用problems,可根据实际需求替换为category_problems) test_result <- test %>% group_by(problems) %>% mutate(lagged.values = lag.values(value)) %>% ungroup() # 查看结果 test_result
输出结果
# A tibble: 7 × 4 problems category_problems value lagged.values <chr> <chr> <dbl> <dbl> 1 money financial insecurity 3 3 2 money financial insecurity 3 2.999999 3 money financial insecurity 3 2.999998 4 food cost of living 2 2 5 food cost of living 2 1.999999 6 bills financial insecurity 1 1 7 bills financial insecurity 1 0.999999
关键说明
- 用
group_by(problems)(或你实际需要的分组列)确保每组内的行号独立计算,符合分组数据集的需求。 - 使用
mutate替代group_map,在原数据框中直接添加新列,保留所有原始数据。 - 用
1e-6替代0.000001,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Shaq
相关产品推荐
相关产品推荐

