我已经搜索了这个问题,但是没有得到我需要的帮助。 假设我有这个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))
答案 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
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)][]