计算 R 子组内的百分比

Calculate percentage within a subgroup in R

我是 R 的新手,我正在努力计算数据框中某些观察值的百分比。我的数据框来自具有许多行和列的 excel table。因此,我首先需要为我需要的信息创建一个查询。我使用以下代码来执行此操作:

am2 %>% 
  group_by(country) %>%
  count(motif) 

输出如下所示:

country     motif                        number
------------------------------------------------
Portugal    architectural elements        26        
Portugal    blossom                        3        
Portugal    crescent moon                 28        
Portugal    crosses                        5        
Portugal    floral                         3        
Spain       four-legged animal            14        
Spain       herringbone                    2        
Spain       horseman                       2        
Sweden      human                          1        
Sweden      inscription                  147
Sweden      spiral                        44

我还从原始数据框中计算了每个国家/地区的观察总数,如下所示:

am2 %>%
  group_by(country) %>%
  summarize("Number of Observations" = n())

这是输出:

country            total number motifs
----------------------------------------
Portugal                  536
Spain                     2110
Sweden                    300

现在我想计算每个国家/地区每个主题的频率。如果我用手做,那就是例如在葡萄牙出现的主题“建筑元素”的数量:

26/536*100

因此,每当国家/地区发生变化时,图案的总数以及百分比计算都会发生变化。我不知道如何使这个过程自动化。谁能帮我这个? 谢谢!

您首先按国家/地区分组以获得每个国家/地区的总和。然后你按国家和动机分组,并使用每个国家的总和来计算你的频率。

 am2 %>%
      group_by(country) %>%
      mutate(sum_country = sum(number)) %>% 
      group_by(country, motif) %>% 
      mutate(freq = number/sum_country,
             freq_perc = freq*100 %>% round(2))

ggplot2 示例:

df <- am2 %>% 
  group_by(country) %>%
  mutate(sum_country = sum(number)) %>% 
  group_by(country, motif) %>% 
  mutate(freq = number/sum_country,
         freq_perc = freq*100 %>% round(2))

library(ggplot2)
df %>% 
  ggplot( aes(x=country, y=freq_perc, fill=motif)) +
  geom_bar(stat="identity", position="dodge")