【问题标题】:A more intelligent way to get percentages for relative frequencies with dplyr?使用 dplyr 获取相对频率百分比的更智能方法?
【发布时间】:2014-07-16 07:29:38
【问题描述】:

学习 R 作为一种爱好并使用我的一些炉石游戏

背景:使用 dplyr 来到这里:

todayhs %.%
   group_by(hero, result) %.%
   select(hero, opponent, result) %.%
   summarise(
     count = n())

数据

hero      result    count   
Mage      loss      12 
Mage      win       9 
Rogue     loss      3                  
Rogue     win       1                  
Warrior   loss      6                  
Warrior   win       5                  

预期结果:该特定英雄的百分比列

hero      result    count   percent
Mage      loss      12      57%
Mage      win       9       43% 
Rogue     loss      3       75%           
Rogue     win       1       25%           
Warrior   loss      6       55%           
Warrior   win       5       45% 

我的障碍
我理解 filter(hero = "Mage") 并使用 prop.table 会得到该单个类的百分比结果,但是有没有办法一次获取所有数据,如上面?

我的尝试

 transform(todayhs.mage, percents = ifelse(hero == "Mage",    
 prop.table(todayhs.mage$count[1:2]),""))          

给我

 hero      result count      percents
 Mage      loss    12        0.571428571428571
 Mage      win     9         0.428571428571429
 Rogue     loss    3                  
 Rogue     win     1                  
 Warrior   loss    6                  
 Warrior    win    5      

我假设我可以编写一个函数并单独删除它们......但这感觉不对。 也许有更好的方法使用 dplyr 添加 group_by(hero, count)?我在这里挠头。

【问题讨论】:

标签: r dplyr frequency


【解决方案1】:

你可以试试:

todayhs <- read.table(text="hero      result    count   
Mage      loss      12 
Mage      win       9 
Rogue     loss      3                  
Rogue     win       1                  
Warrior   loss      6                  
Warrior   win       5",sep="",header=T,stringsAsFactors=F)    

 library(dplyr)
 todayhs%>%
 group_by(hero)%>%
 mutate(percent=paste0(round(100*count/sum(count)),"%"))
# Source: local data frame [6 x 4]
 #Groups: hero

 #     hero result count percent
 # 1    Mage   loss    12     57%
 # 2    Mage    win     9     43%
 # 3   Rogue   loss     3     75%
 # 4   Rogue    win     1     25%
 # 5 Warrior   loss     6     55%
 # 6 Warrior    win     5     45%

【讨论】:

    【解决方案2】:

    或使用data.table(因为您没有说它必须是dplyr 解决方案)

    library(data.table)
    setDT(todayhs)[, Percent := paste0(round(count/sum(count)*100), "%"), by = hero]
    
    #       hero result count Percent
    # 1:    Mage   loss    12     57%
    # 2:    Mage    win     9     43%
    # 3:   Rogue   loss     3     75%
    # 4:   Rogue    win     1     25%
    # 5: Warrior   loss     6     55%
    # 6: Warrior    win     5     45%
    

    【讨论】:

      猜你喜欢
      • 2014-02-23
      • 2014-08-25
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 2014-09-11
      相关资源
      最近更新 更多