如何让diff()函数生效?无法用lag()/lead()计算预期寿命增幅
计算各国预期寿命增幅:diff()函数报错的解决办法
问题描述
尝试计算各国预期寿命增幅时,diff()函数无法正常工作,且不能使用lag()/lead()函数。使用的代码如下:
library(gapminder) gm <- gapminder inclife <- gm %>% drop_na(lifeExp)%>% group_by(country) %>% select(country, year, lifeExp) %>% mutate(inc = diff(lifeExp))
出现的错误信息:
Error in `mutate()`: ! 计算 `inc = diff(lifeExp)` 时出现问题。 ✖ `inc` 的长度必须是12或1,而不是11。 ℹ 错误出现在第1组:country = "Afghanistan"。 运行 `rlang::last_error()` 查看错误发生位置。
错误原因
diff(lifeExp)会计算相邻元素的差值,返回的结果长度比每组原始数据少1(比如阿富汗组有12条数据,diff后得到11个差值),而mutate要求新生成的列必须和原数据行数完全一致,因此触发了长度不匹配的错误。
解决方案
通过给diff()的结果前面添加一个NA值,让新列的长度和每组数据的行数匹配。修改后的代码如下:
library(gapminder) gm <- gapminder inclife <- gm %>% drop_na(lifeExp)%>% group_by(country) %>% select(country, year, lifeExp) %>% mutate(inc = c(NA, diff(lifeExp)))
修改后,每组的inc列开头会有一个NA(表示第一年没有前一年的对比数据,无法计算增幅),后续数值则为对应年份与上一年的预期寿命差值,完美匹配原数据行数,不会再报错。
内容的提问来源于stack exchange,提问作者Warsame
相关产品推荐
相关产品推荐

