【问题标题】:Transform frequencies in factor levels into percentages将因子水平中的频率转换为百分比
【发布时间】:2015-10-17 21:21:52
【问题描述】:

考虑以下数据框:

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' 之间的每个 'aspects' 的百分比是这样的:

为了说明:percentage 中的 7 表示从 aspects 下对应于 dimension s1(本例中为 15)等值的总和中取出的 value 1 的百分比。

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

【问题讨论】:

    标签: r aggregate


    【解决方案1】:

    您可以使用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
    

    【讨论】:

      【解决方案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 函数中并传递所需的精度来执行所需的任何类型的舍入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-27
        • 1970-01-01
        • 1970-01-01
        • 2017-07-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多