这是我的数据框示例: 级别由类别列中每个名称开头的代码给出, 例如:“01 abc”是 1 级,“01.01.01.00 abc”是 4 级
df <- data.frame(
Store = c(rep("A", 9), rep("B", 7)),
Category = c("01 Fruits", "01.01 Apples", "01.01.01 Red Apples", "01.01.02 Green Apples", "01.02 Oranges",
"01.01.01 Navel Oranges", "01.01.02 Valencia Oranges", "01.01.02.01 Sweet", "01.01.02.02 Juicy",
"02 Vegetables", "02.01 Carrots", "02.01.01 Baby Carrots", "02.01.02 Sliced Carrots", "02.01.02.01 Thick", "02.01.02.02 Long","02.02 Broccoli"),
Value = c(100, 50, 30, 20, 50, 20, 30, 20, 10, 150, 75, 35, 40, 25, 15, 75),
Level = c(1,2,3,3,2,3,3,4,4,1,2,3,3,4,4,2)
)
Store Category Value Level
1 A 01 Fruits 100 1
2 A 01.01 Apples 50 2
3 A 01.01.01 Red Apples 30 3
4 A 01.01.02 Green Apples 20 3
5 A 01.02 Oranges 50 2
6 A 01.01.01 Navel Oranges 20 3
7 A 01.01.02 Valencia Oranges 30 3
8 A 01.01.02.01 Sweet 20 4
9 A 01.01.02.02 Juicy 10 4
10 B 02 Vegetables 150 1
11 B 02.01 Carrots 75 2
12 B 02.01.01 Baby Carrots 35 3
13 B 02.01.02 Sliced Carrots 40 3
14 B 02.01.02.01 Thick 25 4
15 B 02.01.02.02 Long 15 4
16 B 02.02 Broccoli 75 2
到目前为止,我已经尝试了以下代码,但离我想要的还差得很远, 我希望每个 4 级类别在其相应的 3 级类别(父级)中的价值份额仅适用于 3 级中的 4 级,并且对于 1:3 级只输入 0 或 100 或为空
# Add a new column for Parent_Category
df$Parent_Category <- sub("\\..*", "", df$Category)
# Group the data by Parent_Category and calculate the total value for each
parent_totals <- df %>%
group_by(Parent_Category) %>%
summarize(Total_Parent_Value = sum(Value))
# Join the parent_totals back to the original data frame
df <- left_join(df, parent_totals, by = "Parent_Category")
# Calculate the Value_Share_Percent column
df <- df %>%
mutate(Value_Share_Percent = round(Value / Total_Parent_Value * 100, 2)) %>%
arrange(Category)
我想要的结果示例:
类别 | 价值 | 等级 | 价值份额 % |
---|---|---|---|
01 水果 | 300 | 1 | 100 |
01.01 苹果 | 270 | 2 | 100 |
01.01.01 红苹果 | 100 | 3 | 100 |
01.01.01.00 甜蜜 | 60 | 4 | 60 |
01.01.01.01 多汁 | 40 | 4 | 40 |