tidyverse 类似于 reshape2::melt 可以做所有事情吗?

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))

我最初在这里有一个有点笨拙的解决方案,但意识到它不起作用。我认为所需的步骤是

  • 存储行维度名称和列维度名称
  • 转换为数据框
  • 将 rowname 添加为名称为“tmp”的列(带有tibble::rownames_to_column("tmp")
  • pivot_longer()with-tmp并设置names_to为列维度名称
  • 将“tmp”重命名为 row_dimension 名称(如果我们使用 NSE 魔法,可以节省一个步骤)

这看起来比 笨重得多melt()。显然我可以编写一个实用函数来封装它,但我想知道我是否缺少一个更紧凑和/或 tidyverse 惯用的解决方案。当数据管道的第一步是矩阵时,其他人会做什么?

All*_*ron 4

如果您不介意在管道中使用基本 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