如何用dplyr计算数据框当前行与前一行的绝对变化及百分比变化?
用dplyr实现数据框的绝对变化与百分比计算
先处理原始数据格式
如果你的原始数据是行名为previous/current的格式,先把行名转为显式列,方便后续操作:
library(dplyr) library(tibble) # 构造原始数据(如果你的数据已经是带period列的,可跳过这步) df <- data.frame( a = c(5, 4), b = c(10, 5), row.names = c("previous", "current") ) %>% rownames_to_column(var = "period")
提取关键值并计算变化
先提取previous和current对应的数值,再计算绝对变化(当前值-前值)和百分比变化((当前值-前值)/前值*100),最后把结果合并到原数据框:
# 提取前值和当前值 prev <- df %>% filter(period == "previous") %>% select(a, b) %>% unlist() curr <- df %>% filter(period == "current") %>% select(a, b) %>% unlist() # 生成变化行并合并 result_df <- df %>% bind_rows( # 绝对变化行 tibble( period = "absolute change", a = curr["a"] - prev["a"], b = curr["b"] - prev["b"] ), # 百分比变化行(转成带%的字符串) tibble( period = "percent change", a = paste0(round((curr["a"] - prev["a"])/prev["a"] * 100, 0), "%"), b = paste0(round((curr["b"] - prev["b"])/prev["b"] * 100, 0), "%") ) )
输出结果
运行后result_df的结构完全符合需求:
# A tibble: 4 × 3 period a b <chr> <chr> <chr> 1 previous 5 10 2 current 4 5 3 absolute change -1 -5 4 percent change -20% -50%
内容的提问来源于stack exchange,提问作者Fisseha Berhane
相关产品推荐
相关产品推荐

