Ben*_*ker 5 r melt tidyr tidyverse
这个问题的答案记录了 tidyverse 的类似物reshape2::melt()是tidyr::pivot_longer()。就目前而言,这是事实,但我仍然发现在 tidyverse 中熔化具有定义的暗名称的矩阵的过程比 tidyverse 等效项方便得多。
例子:
z <- matrix(1:12, ncol=3,
dimnames = list(a = 1:4, b = LETTERS[1:3]))
Run Code Online (Sandbox Code Playgroud)
reshape2::melt(z)自动为我提供一个数据框,其中 ID 列名为“a”和“b”,对应于 的元素names(dimnames(z))。
我最初在这里有一个有点笨拙的解决方案,但意识到它不起作用。我认为所需的步骤是
tibble::rownames_to_column("tmp"))pivot_longer()with-tmp并设置names_to为列维度名称这看起来比 笨重得多melt()。显然我可以编写一个实用函数来封装它,但我想知道我是否缺少一个更紧凑和/或 tidyverse 惯用的解决方案。当数据管道的第一步是矩阵时,其他人会做什么?
如果您不介意在管道中使用基本 R 函数,那么您可以这样做:
z %>%
as.table() %>%
as_tibble()
#> # A tibble: 12 x 3
#> a b n
#> <chr> <chr> <int>
#> 1 1 A 1
#> 2 2 A 2
#> 3 3 A 3
#> 4 4 A 4
#> 5 1 B 5
#> 6 2 B 6
#> 7 3 B 7
#> 8 4 B 8
#> 9 1 C 9
#> 10 2 C 10
#> 11 3 C 11
#> 12 4 C 12
Run Code Online (Sandbox Code Playgroud)
当然,这只是基本 R 等效项的稍微做作的 tidyverse 版本,为了简洁起见,很难击败它。
as.data.frame(as.table(z))
#> a b Freq
#> 1 1 A 1
#> 2 2 A 2
#> 3 3 A 3
#> 4 4 A 4
#> 5 1 B 5
#> 6 2 B 6
#> 7 3 B 7
#> 8 4 B 8
#> 9 1 C 9
#> 10 2 C 10
#> 11 3 C 11
#> 12 4 C 12
Run Code Online (Sandbox Code Playgroud)
这些都给出相同的结果reshape2::melt:
reshape2::melt(z)
#> a b value
#> 1 1 A 1
#> 2 2 A 2
#> 3 3 A 3
#> 4 4 A 4
#> 5 1 B 5
#> 6 2 B 6
#> 7 3 B 7
#> 8 4 B 8
#> 9 1 C 9
#> 10 2 C 10
#> 11 3 C 11
#> 12 4 C 12
Run Code Online (Sandbox Code Playgroud)
创建于 2023-01-24,使用reprex v2.0.2