如何使用 R 从分层 table 派生父子 table?
How to derive a parent-child table from a hierarchical table using R?
我正在尝试使用 collapsibleTree
htmlwidget,它需要一个包含每个节点一行的数据框,即包含所有父子关系(我相信在 data.tree
的说法中称为 DataFrameNetwork ) 以便利用一些更有用的功能。
然而,我从一个包含每片叶子一行的数据框开始(称为 DataFrameTable?),并且正在努力以正确的格式获取它。我相信最简单的方法是使用 data.tree
包,但我愿意接受建议,特别是如果它们面向 tidyverse 并避免循环。
示例:
数据:
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()
但我觉得我正在处理所有错误的事情。
我使用循环从评论中概括了上面的代码。
今天晚些时候将研究 tidyverse 解决方案。
改为矩阵形式
df_mat <- as.matrix(df)
定义一个空的目标矩阵作为输出
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
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")
我正在尝试使用 collapsibleTree
htmlwidget,它需要一个包含每个节点一行的数据框,即包含所有父子关系(我相信在 data.tree
的说法中称为 DataFrameNetwork ) 以便利用一些更有用的功能。
然而,我从一个包含每片叶子一行的数据框开始(称为 DataFrameTable?),并且正在努力以正确的格式获取它。我相信最简单的方法是使用 data.tree
包,但我愿意接受建议,特别是如果它们面向 tidyverse 并避免循环。
示例:
数据:
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()
但我觉得我正在处理所有错误的事情。
我使用循环从评论中概括了上面的代码。 今天晚些时候将研究 tidyverse 解决方案。
改为矩阵形式
df_mat <- as.matrix(df)
定义一个空的目标矩阵作为输出
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
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")