如何为R语言dcast生成的数据框添加百分比变化汇总行?
嘿,我完全懂你这种大数据集没法做reprex的无奈!不过你的需求很清晰——给现有的Summary数据框加一行,计算2019/20相对2018/19的百分比变化对吧?咱们用tidyverse的思路来解决,和你之前的代码风格也匹配:
解决方案步骤
你的Summary是宽格式(行是年份,列是各个Lab),咱们先把需要的两年数据提出来计算变化率,再把结果转成和原数据一致的格式,最后合并进去就行。
方法一:基础提取+计算+绑定
这种方法直接明了,适合快速处理:
# 从原Summary中提取两年的数值(去掉YrFin列) yr_2018 <- Summary[Summary$YrFin == "2018/19", -1] yr_2019 <- Summary[Summary$YrFin == "2019/20", -1] # 计算百分比变化,同时处理分母为0的情况(避免出现Inf/NaN) pct_change <- ifelse(yr_2018 == 0, NA, ((yr_2019 - yr_2018) / yr_2018) * 100) # 把结果转成和原数据结构一致的行,加上年份标识 change_row <- data.frame(YrFin = "% Change 2019/20 vs 2018/19", pct_change) # 合并原数据和新行 Summary_with_change <- rbind(Summary, change_row)
方法二:全tidyverse流程(更贴合你的代码习惯)
如果你习惯用dplyr/tidyr的链式操作,这样写更连贯:
library(dplyr) library(tidyr) # 生成变化率行 change_row <- Summary %>% # 筛选出需要对比的两年 filter(YrFin %in% c("2018/19", "2019/20")) %>% # 转成长格式方便计算 pivot_longer(cols = -YrFin, names_to = "Lab", values_to = "count") %>% # 转回宽格式,把两年的数值放在同一行 pivot_wider(names_from = YrFin, values_from = "count") %>% # 计算百分比变化,处理分母为0的情况 mutate(pct_change = ifelse(`2018/19` == 0, NA, ((`2019/20` - `2018/19`) / `2018/19`) * 100)) %>% # 只保留Lab和变化率 select(Lab, pct_change) %>% # 转回原数据的宽格式 pivot_wider(names_from = Lab, values_from = pct_change) %>% # 加上行的标识 mutate(YrFin = "% Change 2019/20 vs 2018/19") # 合并到原数据 Summary_with_change <- bind_rows(Summary, change_row)
为什么之前的尝试没成功?
你说用rbind结合summarise_all没成功,大概率是因为summarise_all返回的结果没有保留YrFin列,或者列名和原数据不匹配——rbind要求两个数据框的列数、列名完全一致,上面的两种方法都确保了新行和原数据的结构完全对齐,所以能正常合并。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

