用重复的 pivot_longer 或类似的东西重塑 R 数据框 - 代表一棵树?

reshaping R dataframe with repeated pivot_longer or similar - representing a tree?

我在 R 中有一个数据框,我需要对其进行重塑以显示配对关系(基本上是构建一个两列邻接列表的版本 - 除了它比那更复杂一点)。这是数据框。

up_1 <- c(1, 1, 1, 1, 1, 1)
up_2 <- c(4, 3, 2, 3, 3, 3)
up_3 <- c(NA, 7, 5, 6, 6, 6)
up_4 <- c(NA, NA, 8, 9, 10, 11)

df_wide <- tibble(up_1, up_2, up_3, up_4)
df_wide

  up_1  up_2  up_3  up_4
 <dbl> <dbl> <dbl> <dbl>
     1     4    NA    NA
     1     3     7    NA
     1     2     5     8
     1     3     6     9
     1     3     6    10
     1     3     6    11

数据框表示从根 (1) 到叶子 (478910, 11).请注意,这是一个示例数据框 - 最终的应用程序将使用具有可变维度和多个根的更大的数据框。

这是实际的示例树,在插图中:

1
├─ 2
   ├─ 5
      ├─ 8
├─ 3
   ├─ 6
      ├─ 9
      ├─ 10
      ├─ 11
   ├─ 7
├─ 4

我需要将此 transform/pivot/spread 分为两列,其中左列列出所有节点,右列列出所有“上层网络”节点,长格式。所以它最终看起来像这样:

down  up
<dbl> <dbl>
1     4         
1     3         
1     7         
1     6         
1     9         
1     10            
1     11            
1     2         
1     5         
1     8         
4     NA            
3     7         
3     6         
3     9         
3     10            
3     11            
7     NA            
6     9         
6     10            
6     11            
9     NA            
10    NA            
11    NA            
2     5         
2     8         
5     8         
8     NA    

在此示例中,1 有 10 个值“up-network”,3 有 5 个值“up-network”。

澄清应用程序:按 down 列分组,一个人可以识别所有 up 网络上的任何给定 down 值的值(并从那里合并和总结其他与 up 值关联的相关属性)。

我很难弄明白这一点,欢迎所有 Whosebug 英雄提供任何见解!提前谢谢你。

Post-script - 我知道这在更容易的面向对象语言中会更容易(例如 Python),但现在我被困在 R , 考虑到更广泛的分析上下文。

与迭代使用 pivot_longer 的想法不同,这里有一个想法,您可以在旋转之前对列(例如 1:4、2:4、3:4)进行子集化。

如果您只需要独特的组合,可以在 df_long 上使用 unique

library(tidyverse, warn.conflicts = FALSE)

up_1 <- c(1, 1, 1, 1, 1, 1)
up_2 <- c(4, 3, 2, 3, 3, 3)
up_3 <- c(NA, 7, 5, 6, 6, 6)
up_4 <- c(NA, NA, 8, 9, 10, 11)


df_wide <- tibble(up_1, up_2, up_3, up_4)



# iteratively select out columns and pivot longer

df_long <- map_dfr(1:3, ~df_wide %>%
                     select(.x:4) %>%
                     rename('down' = 1) %>%
                     pivot_longer(-down, values_to = 'up') %>%
                     select(-name))
#> Note: Using an external vector in selections is ambiguous.
#> i Use `all_of(.x)` instead of `.x` to silence this message.
#> i See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
#> This message is displayed once per session.

print(df_long, n = 36)               
#> # A tibble: 36 x 2
#>     down    up
#>    <dbl> <dbl>
#>  1     1     4
#>  2     1    NA
#>  3     1    NA
#>  4     1     3
#>  5     1     7
#>  6     1    NA
#>  7     1     2
#>  8     1     5
#>  9     1     8
#> 10     1     3
#> 11     1     6
#> 12     1     9
#> 13     1     3
#> 14     1     6
#> 15     1    10
#> 16     1     3
#> 17     1     6
#> 18     1    11
#> 19     4    NA
#> 20     4    NA
#> 21     3     7
#> 22     3    NA
#> 23     2     5
#> 24     2     8
#> 25     3     6
#> 26     3     9
#> 27     3     6
#> 28     3    10
#> 29     3     6
#> 30     3    11
#> 31    NA    NA
#> 32     7    NA
#> 33     5     8
#> 34     6     9
#> 35     6    10
#> 36     6    11

reprex package (v2.0.0)

于 2021-09-13 创建