计算百分比并保留名称

时间:2019-06-24 23:08:19

标签: r

我有以下DF名为合计。

  Group    Year_2016  Year_2017  Year_2018
    A         342         2342      234
    B         231         2357      6867
    c         67          9796      75474

在下面的代码中,我可以计算正确的百分比,但是它不会保留组列。

percentage = sapply(names(totals)[-1], function(x) {
Year[paste0(x, "_pct")] <<- totals[x] / sum(totals[x]})

我希望按组百分比。很高兴能成为其他列或新的DF。

我还有成百上千的行和列。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

问题中的代码似乎将每一列除以该列的总和,因此我们在此处进行操作。另一方面,说明说您想按组进行操作,我认为这意味着将每一行除以该行的总和。如果要进行后面的计算,则将(1)中的1替换为2。如果您希望每个数字都等于表中所有数字之和的一部分,则省略prop.table的第二个参数,或者对该参数使用NULL。

问题中显示的计算也计算分数,而不是百分比,因此我们在这里进行;但是,说明中用百分比表示。如果您希望百分比将replace的第三个参数乘以100。

可以使用

修改列名称
names(X) <- sub("Year", "pct", names(X))

其中X是下面计算的结果。

除(4)之外,这些均不使用任何软件包。 (1)似乎最灵活,因为它很容易适应行或列。

1)使用prop.table。这给出了每个数字占其列总数的分数。将2替换为1,以得到每个数字占其行总数的分数。

replace(totals, -1, prop.table(as.matrix(totals[-1]), 2))

给予:

  Group Year_2016 Year_2017   Year_2018
1     A 0.5343750 0.1615730 0.002833787
2     B 0.3609375 0.1626078 0.083160763
3     C 0.1046875 0.6758192 0.914005450

2)另一种可能性是sweep

replace(totals, -1, sweep(totals[-1], 2, colSums(totals[-1]), "/"))

3)scale

replace(totals, -1, scale(totals[-1], FALSE, colSums(totals[-1])))

4)或使用dplyr:

library(dplyr)
totals %>% mutate_if(is.numeric, prop.table)

答案 1 :(得分:0)

我们可以将列除以数字列的colSums

DF[paste0(names(DF)[-1], "_pct")] <- DF[-1]/colSums(DF[-1])