将因子水平的频率转换为百分比

时间:2015-10-17 21:21:53

标签: r aggregate

考虑以下数据框:

x <-c(rep (c ("s1", "s2", "s3"),each=5 ))
y <- c(rep(c("a", "b", "c", "d", "e"), 3) )               
z<-c(1:15)    

x_name <- "dimensions"
y_name <- "aspects"
z_name<-"value"
df <- data.frame(x,y,z)
names(df) <- c(x_name,y_name, z_name)

如何为每个因子级别计算和添加新的百分比列?在这种情况下,'value'的每个'dimension'的{​​{1}}百分比,以便我有这样的内容:

enter image description here

举例说明:'aspects'中的7表示percentage中与value 1 aspects对应的dimension下的总值中所占的百分比(15案例)等。

我搜索了论坛,但创建百分比的答案只能跨越一列,而不是两列。我最终制作了这个专栏,首先使用s1计算维度各方面的单独df总值。然后,我将初始aggregate与新df合并,并通过将值列除以总值来创建百分比列。但我觉得这很笨拙。有更简单的方法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用round和快速data.table方法:

library(data.table)
setDT(df)[,percentage:=round(100*value/sum(value)), dimensions][]

#   dimensions aspects value percentage
# 1:         s1       a     1          7
# 2:         s1       b     2         13
# 3:         s1       c     3         20
# 4:         s1       d     4         27
# 5:         s1       e     5         33
# 6:         s2       a     6         15
# 7:         s2       b     7         18
# 8:         s2       c     8         20
# 9:         s2       d     9         22
#10:         s2       e    10         25
#11:         s3       a    11         17
#12:         s3       b    12         18
#13:         s3       c    13         20
#14:         s3       d    14         22
#15:         s3       e    15         23

答案 1 :(得分:2)

在基础R中,您可以使用ave进行这些分组计算:

df$percentage <- ave(df$value, df$dimensions, FUN=function(x) 100*x/sum(x))
df
#    dimensions aspects value percentage
# 1          s1       a     1   6.666667
# 2          s1       b     2  13.333333
# 3          s1       c     3  20.000000
# 4          s1       d     4  26.666667
# 5          s1       e     5  33.333333
# 6          s2       a     6  15.000000
# 7          s2       b     7  17.500000
# 8          s2       c     8  20.000000
# 9          s2       d     9  22.500000
# 10         s2       e    10  25.000000
# 11         s3       a    11  16.923077
# 12         s3       b    12  18.461538
# 13         s3       c    13  20.000000
# 14         s3       d    14  21.538462
# 15         s3       e    15  23.076923

在dplyr中,您可以使用group_bymutate

library(dplyr)
df %>% group_by(dimensions) %>% mutate(percentage=100*value/sum(value))
# Source: local data frame [15 x 4]
# Groups: dimensions [3]
# 
#    dimensions aspects value percentage
#        (fctr)  (fctr) (int)      (dbl)
# 1          s1       a     1   6.666667
# 2          s1       b     2  13.333333
# 3          s1       c     3  20.000000
# 4          s1       d     4  26.666667
# 5          s1       e     5  33.333333
# 6          s2       a     6  15.000000
# 7          s2       b     7  17.500000
# 8          s2       c     8  20.000000
# 9          s2       d     9  22.500000
# 10         s2       e    10  25.000000
# 11         s3       a    11  16.923077
# 12         s3       b    12  18.461538
# 13         s3       c    13  20.000000
# 14         s3       d    14  21.538462
# 15         s3       e    15  23.076923

可以通过将百分比计算包装在round函数中并传递所需的精度来执行任何所需的舍入。