У меня есть набор данных, который выглядит следующим образом
product material
product1 wheat
product1 water
product1 tomato
product2 milk
product3 basil
product3 garlic
И у меня есть это правило, которое гласит, что если продукт состоит из 1 материала, этот материал составляет 100% продукта. Если он состоит из 2 материалов, первый материал составляет 60% от общего количества, а второй материал - 40% от общего количества. Если продукт состоит из 3 материалов, первый материал составляет 70%, второй 20% и последние 10%. Я хочу добавить столбец этих весов, но я не знаю, как это решить. Есть больше правил до 5 материалов, и вес должен быть легко изменить. В конце я хочу, чтобы приведенные выше данные выглядели так:
product material weight
product1 wheat 0.7
product1 water 0.2
product1 tomato 0.1
product2 milk 1
product3 basil 0.6
product3 pizza 0.4
. Вот как я начал
df = tribble(
~product, ~material_type,
"product1", "wheat",
"product1", "Water",
"product1", "tomato",
"product2", "milk",
"product3", "basil",
"product3", "garlic")
df %>%
group_by(product) %>%
mutate(n = n())
product material_type n
<chr> <chr> <int>
1 product1 wheat 3
2 product1 Water 3
3 product1 tomato 3
4 product2 milk 1
5 product3 basil 2
6 product3 garlic 2
. Что дает мне количество материалов в каждой группе и из здесь я не уверен, что делать дальше, и надеюсь, у кого-то есть хорошая идея, которая может мне помочь.
edit:
Я попытался добавить case_when, но это не сработало:
df %>%
group_by(product) %>%
mutate(n = n()) %>%
mutate(weight = case_when(n == 5 ~ c(.4, .3, .1, .1, .1),
n== 4 ~ c(.5, .3, .1, .1),
n ==3 ~ c(.7, .2, .1),
n == 2 ~ c(0.6, 0.4),
TRUE ~ 1))
Error: `n == 5 ~ c(0.4, 0.3, 0.1, 0.1, 0.1)`, `n == 4 ~ c(0.5, 0.3, 0.1, 0.1)`, `n == 2 ~ c(0.6, 0.4)` must be length 3 or one, not 5, 4, 2
Call `rlang::last_error()` to see a backtrace.