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

面板数据按国家、年份、组计算一阶差分全为NA的解决方法

面板数据一阶差分全为NA的解决办法

问题背景

用户拥有如下面板数据集:

df <- data.frame(
  country = c("arg", "arg", "arg", "arg", "arg", "arg", "arg", "arg", "arg", "bra", "bra", "bra", "bra", "bra", "bra", "bra", "bra", "bra"),
  year = c(2000, 2001, 2002, 2003, 2004, 2001, 2002, 2003, 2004, 2000, 2001, 2002, 2003, 2004, 2001, 2002, 2003, 2004),
  group = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "A", "A", "A", "A", "A", "B", "B", "B", "B"),
  value = c(324, 134, 334, 344, 364, 334, 634, 734, 364, 324, 1124, 56574, 3564, 3564, 334, 614, 534, 784)
)

需求是创建新列存储按国家(country)、组别(group)分组后,年份(year)维度的一阶差分,但使用以下代码后新列fd全为NA:

x <- df %>% 
  group_by(country,year, group) %>% 
  mutate(fd = value - lag(value))

问题原因

原代码的分组逻辑错误:同时按country、year、group分组后,每个分组内只有1条数据(例如arg-2000-A仅1行),lag(value)无法获取到前一行的值,因此差分结果全为NA。

正确的分组逻辑应该是按country和group分组,在同一国家同一组别内,按年份顺序计算相邻年份的value差值。

解决方案

  1. 先按country、group、year排序,确保年份是连续递增的(避免因数据顺序混乱导致差分错误)
  2. 仅按country和group分组,计算一阶差分

代码实现:

library(dplyr)

x <- df %>%
  arrange(country, group, year) %>%  # 先排序保证年份顺序
  group_by(country, group) %>%       # 正确分组:国家+组别
  mutate(fd = value - lag(value)) %>%
  ungroup()  # 可选:取消分组,方便后续操作

# 查看结果
print(x)

结果验证

运行后部分结果如下:

# A tibble: 18 × 5
   country  year group value    fd
   <chr>   <dbl> <chr> <dbl> <dbl>
 1 arg      2000 A       324    NA
 2 arg      2001 A       134  -190
 3 arg      2002 A       334   200
 4 arg      2003 A       344    10
 5 arg      2004 A       364    20
 6 arg      2001 B       334    NA
 7 arg      2002 B       634   300
 8 arg      2003 B       734   100
 9 arg      2004 B       364  -370
...

可以看到,同一国家同一组别内的年份差分已正确计算,仅每组的第一行因无前值为NA,符合预期。

内容的提问来源于stack exchange,提问作者Pedro Cardoso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 21:08:17