在 R 中为分层数据创建 Parent/Child ID

Create Parent/Child ID's for Hierarchical Data in R

我有一些分层数据,我正试图将其转化为更相关的样式 table。我想将一列更改为我的数据框,告诉我每一行的父项。在这里,Lights 是 Electrical 的子项,Wiring 和 Bulbs 都是 Lights 的子项,等等。有没有一种方法可以说“如果 Level = 2,在数据框中找到它上方最近的 Level 1,并将其指定为其父级?”另一个例子是:如果该行是 3 级项目(布线),则其父级将是数据帧中距离它最近的 2 级项目(灯)。

我需要它上面最近的级别,因为数据是分层存储的。

Level   Group    Name     Price
1        01    Electrical  200
2        01    Lights      82
3        01    Wiring      60
3        01    Bulbs       22
2        01    Vent        118
3        01    Detector    60
3        01    Cable       20
3        01    Plastic     25
3        01    Brackets    13

1        02    Interior    500
2        02    Doors       300
3        02    Knobs       40
2        02    Trim        200
3        02    Shelves     150
4        02    Brackets    50 

期望的输出类似于:

Level   Group    Name     Price  ID Parent
1        01    Electrical  200   1   None 
2        01    Lights      82    2    1
3        01    Wiring      60    3    2
3        01    Bulbs       22    4    2
2        01    Vent        118   5    1
3        01    Detector    60    6    5
3        01    Cable       20    7    5
3        01    Plastic     25    8    5
3        01    Brackets    13    9    5

1        02    Interior    500   10  None
2        02    Doors       300   11   10
3        02    Knobs       40    12   11
2        02    Trim        200   13   10
3        02    Shelves     150   14   13
4        02    Brackets    50    15   14 

这是一种方法,但我认为应该有其他 better/efficient 解决方案。

library(dplyr)
library(purrr)

df %>%
  mutate(ID = row_number()) %>%
  group_by(Group) %>%
  mutate(Parent = map2_dbl(Level, ID, ~{
    tmp <- ID[Level == .x - 1]
    val <- tmp - .y
    if(any(val < 0)) max(tmp[val < 0]) else NA
    })) %>%
  ungroup

#   Level Group Name       Price    ID Parent
#   <int> <int> <chr>      <int> <int>  <dbl>
# 1     1     1 Electrical   200     1     NA
# 2     2     1 Lights        82     2      1
# 3     3     1 Wiring        60     3      2
# 4     3     1 Bulbs         22     4      2
# 5     2     1 Vent         118     5      1
# 6     3     1 Detector      60     6      5
# 7     3     1 Cable         20     7      5
# 8     3     1 Plastic       25     8      5
# 9     3     1 Brackets      13     9      5
#10     1     2 Interior     500    10     NA
#11     2     2 Doors        300    11     10
#12     3     2 Knobs         40    12     11
#13     2     2 Trim         200    13     10
#14     3     2 Shelves      150    14     13
#15     4     2 Brackets      50    15     14

我们创建 ID 列,它是数据框中的行号,对于组中的每个 Level,我们找出最近的 ID 值,该值比当前值高一级等级.