我有一个包含产品和数量的数据框架。我想,对于每个产品,在子产品X1、X2、X3中按比例分配添加3行。比例基于重量:
X1 = 0.19
X2 = 0.26
X3 = 0.55
数据帧看起来像:
df = data.frame(Product = c("A","B","C","D"), value = c(30,35,42,12))
Product Quantity
1 A 30
2 B 35
3 C 42
4 D 1
我想在最后构建的表格应该是这样的:
Product Quantity
1 A 30.00
2 X1 5.70
3 X2 7.80
4 X3 16.50
5 B 35.00
6 X1 0.00
7 X2 9.10
8 X3 19.25
9 C 42.00
10 X1 0.00
11 X2 10.92
12 X3 23.10
13 D 12.00
14 X1 0.00
15 X2 3.12
16 X3 6.60
有没有一种不使用循环的R方法(以防产品太多(?
您可以为比例信息创建一个数据帧,并使用crossing
创建具有原始df
的所有行组合。
library(dplyr)
ref <- data.frame(Product1 = c('X1', 'X2', 'X3'),
Quantity1 = c(0.19, 0.26, 0.55))
tidyr::crossing(ref, df) %>%
transmute(Product, Product1, value = Quantity1 * value) %>%
bind_rows(df) %>%
arrange(Product, !is.na(Product1)) %>%
mutate(Product = coalesce(Product1, Product)) %>%
select(-Product1)
# Product value
# <chr> <dbl>
# 1 A 30
# 2 X1 5.7
# 3 X2 7.8
# 4 X3 16.5
# 5 B 35
# 6 X1 6.65
# 7 X2 9.1
# 8 X3 19.2
# 9 C 42
#10 X1 7.98
#11 X2 10.9
#12 X3 23.1
#13 D 12
#14 X1 2.28
#15 X2 3.12
#16 X3 6.6