DataFrame中lag()函数重复反向计算问题及解决方法
解决lag()跨国家计算GDP增幅的问题
问题出在你没有按国家分组就使用lag(),导致lag会取到其他国家的行数据,自然出现跨国家反向计算的错误。
修正思路很简单:先按国家分组,让lag()只在同一个国家的行范围内取前一行数据,再计算增幅,最后筛选出有效行(2010年的记录)。
假设你的CA_less数据框里的国家列名为Country(如果不是,替换成你实际的列名),修正后的代码如下:
library(dplyr) CA_GDP_decade <- CA_less %>% # 按国家分组,确保lag只在同国家内计算 group_by(Country) %>% # 计算前一年份、前一年GDP,以及增幅 mutate( Year2 = lag(Year, 1), GDP2 = lag(GDP, 1), CHANGE_PERC = ((GDP - GDP2) / GDP2) * 100 ) %>% # 对数值型列取整 mutate_if(is.numeric, round, digits = 0) %>% # 取消分组,避免后续操作受分组影响 ungroup() %>% # 筛选出2010年的行(即每个国家的增幅有效行) filter(Year == 2010) CA_GDP_decade
关键说明:
group_by(Country):这是核心,让所有后续的mutate操作都在单个国家的子集内执行,lag()只会取当前国家的前一行数据(也就是1960年的GDP)。ungroup():分组后记得取消分组,防止后续对整个数据框操作时出现意外的分组行为。filter(Year == 2010):直接筛选出每个国家2010年的记录,也就是我们需要的增幅结果行,自动去掉1960年的无效行。
另外,你原来的代码有语法错误:CHANGE_PERC = ((GDP - GDP2) / GDP2 ) * 100后面的%>%位置不对,应该放在整个mutate()的外面,上面的代码已经修正了这个问题。
内容的提问来源于stack exchange,提问作者FirstCosmonaut
相关产品推荐
相关产品推荐

