计算列中出现字符串的百分比

时间:2018-12-20 13:02:47

标签: r dplyr

我已经搜索了这个问题,但是没有得到我需要的帮助。 假设我有这个data.frame:

df<-data.frame(
  "id"= 1:10, 
  "fruit"=c("apple", "banana", "orange", "apple","apple", "banana", 
            "orange","apple", "banana", "orange"),
  "bowl"=c("red", "green", "green", "green", "green", "green",
            "green", "green","red","red")
             )

我想创建多面饼图,因此我想知道每个碗中每种水果的百分比。如果这将是数字值,那么我会找到很多帮助,但是由于它是字符串,所以我似乎无法使用它。 我尝试了以下方法的变体:

df %>% group_by(bowl) %>% mutate(varfruit=count(fruit))  

3 个答案:

答案 0 :(得分:1)

使用dplyr,我们可以为每个count fruit每个bowl fruits并得到比率除以library(dplyr) df %>% group_by(bowl) %>% count(fruit) %>% mutate(perc = n/sum(n)) %>% select(-n) # bowl fruit perc # <fct> <fct> <dbl> #1 green apple 0.429 #2 green banana 0.286 #3 green orange 0.286 #4 red apple 0.333 #5 red banana 0.333 #6 red orange 0.333 的总数。

prop.table

使用prop.table(with(df, table(bowl, fruit)), 1) # fruit #bowl apple banana orange # green 0.4285714 0.2857143 0.2857143 # red 0.3333333 0.3333333 0.3333333

的基本R选项
data.frame(prop.table(with(df, table(bowl, fruit)), 1))

如果要保持数据的长结构,我们可以通过以下方式将其转换为数据帧

proc_sum

答案 1 :(得分:1)

尝试一下。这不是最有效的方法,但是它有助于逐行运行代码以查看发生了什么。

library(dplyr)

df %>% 
  group_by(bowl) %>% 
  mutate(bowl_size = n()) %>% 
  ungroup() %>% 
  group_by(bowl, fruit) %>% 
  mutate(
    fruit_size = n(), 
    fruit_pct = fruit_size / bowl_size
  ) %>% 
  ungroup() %>% 
  arrange(bowl)

答案 2 :(得分:1)

我们可以使用data.table

library(data.table)
setDT(df)[, .N, .(fruit, bowl)][, perc := N/sum(N), .(bowl)][]