如何使用R从层次表中派生父子表?

时间:2018-02-19 22:00:50

标签: r tree hierarchical-data

我正在尝试使用collapsibleTree htmlwidget,它需要一个包含每个节点行的数据帧,即包含所有父子关系(我认为在data.tree用语中称为DataFrameNetwork)为了利用一些更有用的功能。

然而,我开始使用包含每个叶子行的数据帧(称为DataFrameTable?),并且我正在努力以正确的格式获取它。我认为最简单的方法是使用data.tree包,但我愿意接受建议,特别是如果它们是朝向整形并避免循环的话。

示例:

数据:

lev1 <- c("A","A","A","B","B","C")
lev2 = c("a", letters[1:5])
lev3 = 1:6
df <- data.frame(lev1, lev2, lev3)

目标:

result <- data.frame(parent = c(lev1, lev2),
                     child = c(lev2, lev3)) %>% unique()

(我知道可怕的代码)。此特定示例在层次结构中有三个级别,但我需要解决方案足够通用以应用于任意数量的级别。我已经尝试根据文档向数据框添加一个pathString并跟进FromDataFrameTable()然后ToDataFrameNetwork(),但我觉得我的事情都是错误的。

2 个答案:

答案 0 :(得分:1)

希望这有帮助!

library(zoo)
library(data.table)
library(dplyr)

rbindlist(lapply(as.data.frame(rollapply(names(df), 2, c), stringsAsFactors = F), 
                 function(x) select(df, c(x)))) %>%
  distinct() %>%
  `colnames<-`(c("parent", "child"))

输出是:

    parent child
 1:      A     a
 2:      A     b
 3:      B     c
 4:      B     d
 5:      C     e
 6:      a     1
 7:      a     2
 8:      b     3
 9:      c     4
10:      d     5
11:      e     6

示例数据:

df <- structure(list(lev1 = structure(c(1L, 1L, 1L, 2L, 2L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), lev2 = structure(c(1L, 1L, 2L, 
3L, 4L, 5L), .Label = c("a", "b", "c", "d", "e"), class = "factor"), 
    lev3 = 1:6), .Names = c("lev1", "lev2", "lev3"), row.names = c(NA, 
-6L), class = "data.frame")

答案 1 :(得分:0)

我使用循环从注释中推广了以上代码。 将在今天晚些时候开展一项整合解决方案。

更改为矩阵形式

df_mat <- as.matrix(df)

将空的traget矩阵定义为输出

df_output <- matrix(nrow=0,ncol=2)

for (i in 1:(ncol(df_mat)-1))
{
  df_output <- rbind(df_output,df_mat[,c(i,i+1)])
}

更改为数据框

df_output <- as.data.frame(df_output)

指定有意义的列名

colnames(df_output) <- c("Parent","Child")

输出

df_output