在 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
值,该值比当前值高一级等级.
我有一些分层数据,我正试图将其转化为更相关的样式 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
值,该值比当前值高一级等级.