面板数据按国家、年份、组计算一阶差分全为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差值。
解决方案
- 先按
country、group、year排序,确保年份是连续递增的(避免因数据顺序混乱导致差分错误) - 仅按
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
相关产品推荐
相关产品推荐

