R中的条件比例/相对频率
conditional proportion / relative frequency in R
有没有可以简化这段代码的可用函数?想知道特定 week
中 product
的 sales
占其总销售额的比例
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
不清楚您的问题是关于一个函数(在这种情况下,您可能正在寻找 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
在 base 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.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
有没有可以简化这段代码的可用函数?想知道特定 week
中 product
的 sales
占其总销售额的比例
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
不清楚您的问题是关于一个函数(在这种情况下,您可能正在寻找 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
在 base 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.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