如何在R中基于现有DataFrame创建指定列的百分比表格?
计算DataFrame中列的相对百分比(基于指定列)
我懂你想要把1到4列的数值转换成对应行All列的百分比,用prop.table没得到预期结果的困扰——确实,prop.table默认是按行/列的总和来计算比例,和咱们这次的需求不匹配,咱们换个直接的方法来实现。
方法一:基础R实现
先复制原数据框避免修改原始数据,然后对目标列做逐行的除法运算:
# 复制原数据 dd_percent <- dd # 计算第3到第6列(对应列名1、2、3、4)相对于All列的百分比,保留1位小数 dd_percent[, 3:6] <- round(dd[, 3:6] / dd[, "All"] * 100, 1) # 查看结果 print(dd_percent)
运行后会得到和你期望一致的输出:
Sample All 1 2 3 4 1 E1 250 11.6 10.8 4.4 7.2 2 E2 210 17.1 11.4 13.3 10.0 3 E3 130 22.3 7.7 9.2 17.7 4 E4 140 23.6 17.1 15.7 10.0 5 E5 220 12.3 7.3 8.6 8.2
如果需要保留更多小数位(比如你示例里E3的4列是17.69),只需要把round的第二个参数改成2就行:round(..., 2)。
方法二:tidyverse(dplyr)实现
如果你习惯用tidyverse语法,用mutate+across可以更简洁地完成:
library(dplyr) dd_percent <- dd %>% mutate(across(`1`:`4`, ~ round(.x / All * 100, 1)))
这里across(1:4, ...)会对1到4的每一列执行后面的计算逻辑:用当前列的值除以同一行的All值,乘以100后保留1位小数。
为什么prop.table不适用?
prop.table(dd[,3:6], 1)会计算每行的数值占该行所有目标列总和的比例,但咱们的需求是占All列的比例,而不是行内目标列的总和,所以prop.table不符合这次的计算逻辑。
内容的提问来源于stack exchange,提问作者N.100
相关产品推荐
相关产品推荐

