层次数据的R递归合并

层次数据的R递归合并,r,R,我有一个带有子字段和父字段的数据帧,用于gnucash mysql数据库中的帐户。我想将帐户层次结构存储在数据框中。在过去,我在mySQL中使用了递归连接,但随着层次结构的加深,它变得越来越麻烦。你还必须知道你的树有多少层。我希望在R中有一种更简单的方法来构建层次结构(无论是否知道最大深度) 样本数据: account_id <- c(1:11) account_name <- c('root_account','dining', 'food', 'discretionary_exp

我有一个带有子字段和父字段的数据帧,用于gnucash mysql数据库中的帐户。我想将帐户层次结构存储在数据框中。在过去,我在mySQL中使用了递归连接,但随着层次结构的加深,它变得越来越麻烦。你还必须知道你的树有多少层。我希望在R中有一种更简单的方法来构建层次结构(无论是否知道最大深度)

样本数据:

account_id <- c(1:11)
account_name <- c('root_account','dining', 'food', 'discretionary_expense',
                  'expenses', 'base_salary_wife', 'base_salary_husband',
                  'base_salary', 'salary', 'taxable_income',
                  'income')
account_parentid <- c(NA,3,4,5,1,8,8,9,10,11,1)
test.data <- data.frame(account_id, account_name, account_parentid)

您可以使用data.tree包处理层次结构数据:

获取测试数据:

account_id <- c(1:11)
account_name <- c('root_account','dining', 'food', 'discretionary_expense',
                  'expenses', 'base_salary_wife', 'base_salary_husband',
                  'base_salary', 'salary', 'taxable_income',
                  'income')
account_parentid <- c(NA,3,4,5,1,8,8,9,10,11,1)
test.data <- data.frame(account_id, account_parentid, account_name, stringsAsFactors = F)
这将表明:

               levelName account          account_name    pathString
1  1                           1          root_account             1
2   ¦--5                       5              expenses           1/5
3   ¦   °--4                   4 discretionary_expense         1/5/4
4   ¦       °--3               3                  food       1/5/4/3
5   ¦           °--2           2                dining     1/5/4/3/2
6   °--11                     11                income          1/11
7       °--10                 10        taxable_income       1/11/10
8           °--9               9                salary     1/11/10/9
9               °--8           8           base_salary   1/11/10/9/8
10                  ¦--6       6      base_salary_wife 1/11/10/9/8/6
11                  °--7       7   base_salary_husband 1/11/10/9/8/7
这不是问题的一部分,但真正有趣的是,当您想对层次结构进行总结时,等等。请参阅data.tree vignettes和

library(data.tree)
tree1 <- FromDataFrameNetwork(test.data[-1,])
tree1$account_name <- 'root_account'
ToDataFrameTree(tree1, account = 'name', 'account_name', 'pathString')
               levelName account          account_name    pathString
1  1                           1          root_account             1
2   ¦--5                       5              expenses           1/5
3   ¦   °--4                   4 discretionary_expense         1/5/4
4   ¦       °--3               3                  food       1/5/4/3
5   ¦           °--2           2                dining     1/5/4/3/2
6   °--11                     11                income          1/11
7       °--10                 10        taxable_income       1/11/10
8           °--9               9                salary     1/11/10/9
9               °--8           8           base_salary   1/11/10/9/8
10                  ¦--6       6      base_salary_wife 1/11/10/9/8/6
11                  °--7       7   base_salary_husband 1/11/10/9/8/7