用重复的 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
) 到叶子 (4
、7
、8
、9
、10
, 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 创建
我在 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
) 到叶子 (4
、7
、8
、9
、10
, 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 创建