You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中使用管道函数计算数据框的列内占比贡献

计算数据框列内占比的实现方法

先加载你的数据集

首先把你提供的数据加载到R中:

df <- structure(list(`Row Labels` = c("X1", "X2", "X3", "X4"), `2019-01-01` = c(37, 
36, 45, 53), `2019-02-01` = c(3, 19, 14, 46), `2019-03-01` = c(28, 
2, 28, 28), `2019-04-01` = c(48, 70, 18, 16), `2019-05-01` = c(83, 
71, 58, 26), `2019-06-01` = c(85, 28, 83, 46), `2019-07-01` = c(60, 
20, 12, 77), `2019-08-01` = c(44, 66, 30, 99), `2019-09-01` = c(21, 
14, 31, 21), `2019-10-01` = c(26, 72, 72, 16), `2019-11-01` = c(15, 
96, 23, 100), `2019-12-01` = c(65, 0, 98, 66)), row.names = c(NA, 
-4L), class = c("tbl_df", "tbl", "data.frame"))

方法一:基础R实现

直接对数值列做按列运算,每个元素除以对应列的总和,最后合并标签列:

# 提取数值列(排除第一列的Row Labels)
num_cols <- df[, -1]
# 按列计算占比,保留4位小数
prop_cols <- apply(num_cols, 2, function(x) round(x / sum(x), 4))
# 合并Row Labels和计算后的占比列
result_base <- cbind(df[, 1], prop_cols)
# 保持原数据框类型
result_base <- as_tibble(result_base)

方法二:tidyverse(dplyr)实现

用dplyr的across函数批量处理数值列,代码更简洁:

library(dplyr)

result_tidy <- df %>%
  mutate(across(-`Row Labels`, ~ round(.x / sum(.x), 4)))

说明

两种方法得到的结果和你给出的预期输出完全匹配。如果需要调整小数位数,只需修改round函数的第二个参数即可(比如要保留5位小数就改成5)。

内容的提问来源于stack exchange,提问作者Mr Pool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:22:49