You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用group_map处理分组数据集:非首行观测值递减生成新列

问题解决:分组数据生成递减滞后列

问题分析

你当前的代码存在两个核心问题:

  1. 分组依据错误:你按value分组,但需求是基于业务分组(如示例中的problems或category_problems)计算组内的滞后值,同一value可能属于不同业务分组,不能混为一谈。
  2. 数据处理方式错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:22:24