R: Создать структуру агрегации из отношения родитель / потомок - PullRequest
2 голосов
/ 08 апреля 2020

Я хочу создать структуру агрегации в базе данных, используя отношения родитель-потомок, как в этом кадре данных:

df <- data.frame(Child=c("C","C11","C111","C112","C12","C121","C122","C123","C13","C131","C132"),
                 Parent=c("","C","C11","C11","C","C12","C12","C12","C","C13","C13"))

Из этого кадра данных родитель-потомок я хотел бы получить списки, подобные это (для дальнейшего использования в функции):

list.C <- c("C11","C12","C13")
list.C11 <- c("C111","C112")
list.C12 <- c("C121","C122","C123")
list.C13 <- c("C131","C132")

Я пытался создать свой список с помощью al oop через строки и функцию назначения, но не сработало ... любой Идея как создать это - или список векторов?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Вам не нужно для l oop. Я могу предложить вам решение data.table.

library(data.table)
setDT(df)

Если вы хотите, чтобы ваш вывод был кадром данных:

 df[,.(Child = list(Child)), by = Parent]
   Parent          Child
1:                     C
2:      C    C11,C12,C13
3:    C11      C111,C112
4:    C12 C121,C122,C123
5:    C13      C131,C132

Если вы предпочитаете список:

list_parents <- split(
  df[,.(list(Child)), by = Parent],
  by = "Parent"
)
list_parents
[[1]]
   Parent Child
1:            C

$C
   Parent       Child
1:      C C11,C12,C13

$C11
   Parent     Child
1:    C11 C111,C112

$C12
   Parent          Child
1:    C12 C121,C122,C123

$C13
   Parent     Child
1:    C13 C131,C132
1 голос
/ 08 апреля 2020

Мы можем использовать split в base R

split(as.character(df$Child), df$Parent)

Если мы хотим удалить пробелы в 'Parent'

lst1 <- with(subset(df, Parent != ''), split(as.character(Child),
             droplevels(Parent)))
...