R中的条件比例/相对频率

R中的条件比例/相对频率,r,dplyr,tidyverse,R,Dplyr,Tidyverse,是否有任何可用的函数可以简化此代码?想知道特定周产品的销售额占其总销售额的比例 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 %>

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

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
库(dplyr)
#创建data.frame
df%
汇总(总额=总额(销售额))
#预期结果
df_道具%
内部联接(df_总和)%>%
变异(道具=销售额/总额)%>%
选择(-sales,-total)#可选
结果:

#> 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
#>tible:4 x 3
#>周产品道具
#>        
#>1 A 0.4444
#>100万美元
#>2 A 0.5555
#>2C 1.000000

不清楚您的问题是关于函数(在本例中,您可能要查找
道具表)还是关于方法(如在同一步骤中将销售额除以销售额之和)

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

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
在上面的例子中,
xtabs
步骤只是重塑数据的形状,然后使用
prop.table
,其比例基于行总数

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

不清楚您的问题是关于函数(在本例中,您可能要查找
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
在上面的例子中,
xtabs
步骤只是重塑数据的形状,然后使用
prop.table
,其比例基于行总数

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

它可以是一条带有数据的短线。表包:

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
# 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
或者,如果您正在寻找dyplr解决方案,那么正如@Brian所建议的:

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

   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
# 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
#一个tible:4 x 4
#组别:产品[3]
周产品销售道具
1 A 40 0.444
21B2001.0000000
3 2 A 50 0.556
4 2 C 10 1.0000000

它可以是一条带有数据的短线。表包:

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
# 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
或者,如果您正在寻找dyplr解决方案,那么正如@Brian所建议的:

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

   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
# 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
#一个tible:4 x 4
#组别:产品[3]
周产品销售道具
1 A 40 0.444
21B2001.0000000
3 2 A 50 0.556
4 2 C 10 1.0000000

你也可以使用:
df%>%mutate(prop=sales/sum(sales))
@A5C1D2H2I1M1N2O1R2T1,我误解了所需的比例,你是对的。你也可以使用:
df%>%group\u by(product)%%>%mutate(prop=sales/sum(sales))
你也可以使用:
df%>%mutate(prop=sales/sum(sales))
@a5c1d2h2i1m1n2r2t1,我误读了期望的比例,你是对的。你也可以使用:
df%>%groupby(product)%%>%mutate(prop=sales/sum(sales))
你可以做
data.frame(prop.table(xtabs(sales~product+week,df),1))
来重新排列它。你可以做
data.frame(prop.table(xtabs(sales~product+week,df),1))
来重新排列它