【问题标题】:conditional proportion / relative frequency in RR中的条件比例/相对频率
【发布时间】:2017-09-08 03:51:25
【问题描述】:

是否有任何可用的函数可以简化此代码?想知道特定weeksalesproduct 占其总销售额的比例

library(dplyr)

# Create data.frame
df <- tribble(
  ~week, ~product, ~sales,
  1L,    "A",      40,
  1L,    "B",      20,
  2L,    "A",      50,
  2L,    "C",      10
)

# Total sales
df_summ <- df %>%
  group_by(product) %>%
  summarise(total = sum(sales))

# Expected result
df_prop <- df %>%
  inner_join(df_summ) %>%
  mutate(prop = sales / total) %>%
  select(-sales, -total)  # optional

结果:

#> A tibble: 4 x 3
#>  week product     prop
#> <int>   <chr>    <dbl>
#>     1       A 0.444444
#>     1       B 1.000000
#>     2       A 0.555555
#>     2       C 1.000000

【问题讨论】:

  • 您也可以使用:df %&gt;% mutate(prop = sales/sum(sales) )
  • @A5C1D2H2I1M1N2O1R2T1,我看错了想要的比例,你是对的。
  • 您也可以使用:df %&gt;% group_by(product) %&gt;% mutate(prop = sales/sum(sales) )

标签: r dplyr tidyverse


【解决方案1】:

不清楚您的问题是关于函数(在这种情况下,您可能正在寻找 prop.table)还是关于方法(例如在同一步骤中将销售额除以销售额总和)。

无论如何,您应该能够通过以下方式获得所需的输出:

df %>% 
  group_by(product) %>% 
  mutate(prop = prop.table(sales)) %>% ## OR > mutate(prop = sales/sum(sales))
  select(-sales)
# # A tibble: 4 x 3
# # Groups:   product [3]
#    week product      prop
#   <int>   <chr>     <dbl>
# 1     1       A 0.4444444
# 2     1       B 1.0000000
# 3     2       A 0.5555556
# 4     2       C 1.0000000

在基础 R 中,您可以使用 prop.table 获取值(但格式不同)。试试:

prop.table(xtabs(sales ~ product + week, df), 1)
#        week
# product         1         2
#       A 0.4444444 0.5555556
#       B 1.0000000 0.0000000
#       C 0.0000000 1.0000000

在上面,xtabs 步骤只是重塑您的数据,然后您使用 prop.table 并根据行总数的比例。

> xtabs(sales ~ product + week, df)
       week
product  1  2
      A 40 50
      B 20  0
      C  0 10

【讨论】:

  • 你可以通过data.frame(prop.table(xtabs(sales ~ product + week, df), 1))重新排列它
【解决方案2】:

data.table 包可以是一小行:

setDT(df)[, prop:=sales/sum(sales), by=product]

输出:

   week product sales      prop
1:   1L       A    40 0.4444444
2:   1L       B    20 1.0000000
3:   2L       A    50 0.5555556
4:   2L       C    10 1.0000000

或者,如果您正在寻找 dyplr 解决方案,那么正如@Brian 建议的那样:

df %>% group_by(product) %>% mutate(prop = sales/sum(sales))

输出:

# A tibble: 4 x 4
# Groups:   product [3]
   week product sales      prop
  <int>   <chr> <dbl>     <dbl>
1     1       A    40 0.4444444
2     1       B    20 1.0000000
3     2       A    50 0.5555556
4     2       C    10 1.0000000

【讨论】:

    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2019-12-17
    • 2020-04-24
    • 2018-10-25
    相关资源
    最近更新 更多