【问题标题】:Find a percentage based on multiple columns of criteria in R根据R中的多列标准查找百分比
【发布时间】:2014-06-16 15:42:40
【问题描述】:

我有多个列,我想找出一列在其他列中的百分比是否相同。例如;

ST  cd  variable
1   1   23432
1   1   2345
1   2   908890
1   2   350435
1   2   2343432
2   1   9999
2   1   23432 

所以我想做的是:

如果 ST 和 cd 相同,则求该行的变量占所有具有相同 ST 和 cd 的百分比。所以最后它看起来像:

ST  cd  variable  percentage
1   1   23432     90.90%
1   1   2345      9.10%
1   2   908890    25.30%
1   2   350435    9.48%
1   2   2343432   65.23%
2   1   9999      29.91%
2   1   23432     70.09%

如何在 R 中做到这一点?

感谢大家的帮助。

【问题讨论】:

  • ?ave。类似ave(var, ST, cd, FUN = prop.table)
  • 您想使用这些百分比进行进一步处理还是您需要的最终输出?请注意,如果您在值中添加 % 符号,则该列将被强制转换为字符,因此对于进一步的数字运算没有用处。

标签: r sum match apply sumifs


【解决方案1】:

你可以创建你的比例格式函数:

prop_format <- 
function (x, digits=4) 
{
  x <- round(x/sum(x), digits)*100
  paste0(x,'%')
}

然后使用ave

ave(dt$variable,list(dt$ST,dt$cd),FUN=prop_format)

[1] "90.9%"  "9.1%"   "25.23%" "9.73%"  "65.05%" "29.91%" "70.09%"

【讨论】:

  • 工作得很好,但我发现忽略 prop_format 函数并用 FUN=prop.table 替换它更容易
【解决方案2】:
library(data.table)

DT <- data.table(read.table(text = "ST  cd  variable
1   1   23432
1   1   2345
1   2   908890
1   2   350435
1   2   2343432
2   1   9999
2   1   23432 ", header = TRUE))

DT[, percentage := variable / sum(variable) , by = list(ST, cd)]

##    ST cd variable percentage
## 1:  1  1    23432 0.90902743
## 2:  1  1     2345 0.09097257
## 3:  1  2   908890 0.25227624
## 4:  1  2   350435 0.09726856
## 5:  1  2  2343432 0.65045519
## 6:  2  1     9999 0.29909366
## 7:  2  1    23432 0.70090634

【讨论】:

    【解决方案3】:

    使用dplyr

    require(dplyr)
    
    df %>% group_by(ST, cd) %>% mutate(percentage = variable/sum(variable))
    
    #  ST cd variable percentage
    #1  1  1    23432 0.90902743
    #2  1  1     2345 0.09097257
    #3  1  2   908890 0.25227624
    #4  1  2   350435 0.09726856
    #5  1  2  2343432 0.65045519
    #6  2  1     9999 0.29909366
    #7  2  1    23432 0.70090634
    

    您可以根据需要进行修改:

    dd %>% group_by(ST, cd) %>% mutate(percentage = round(variable/sum(variable)*100, 2))
    
    #  ST cd variable percentage
    #1  1  1    23432      90.90
    #2  1  1     2345       9.10
    #3  1  2   908890      25.23
    #4  1  2   350435       9.73
    #5  1  2  2343432      65.05
    #6  2  1     9999      29.91
    #7  2  1    23432      70.09
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多