簡體   English   中英

reshape2::melt 的 tidyverse 模擬可以做所有事情嗎?

[英]tidyverse analog of reshape2::melt that does everything?

這個問題的答案記錄了reshape2::melt()的 tidyverse 模擬是tidyr::pivot_longer() 就目前而言,這是真的,但我仍然發現在 tidyverse 中熔化具有定義的 dimnames 的矩陣的過程比 tidyverse 等價物更不方便。

例子:

z <- matrix(1:12, ncol=3, 
       dimnames = list(a = 1:4, b = LETTERS[1:3]))

reshape2::melt(z)自動給我一個數據框,其中 ID 列名為“a”和“b”,對應於names(dimnames(z))的元素。

我最初在這里有一個有點笨拙的解決方案,但意識到它沒有用。 認為所需的步驟是

  • 存儲行維度名稱和列維度名稱
  • 轉換為數據框
  • 將行名添加為名稱為“tmp”的列(使用tibble::rownames_to_column("tmp")
  • pivot_longer()-tmp並將names_to設置為列維度名稱
  • 將“tmp”重命名為 row_dimension 名稱(如果我們使用 NSE 魔法可以節省一步)

這似乎比melt()笨拙得多。 顯然我可以編寫一個實用程序 function 來封裝它,但我想知道我是否缺少一個更緊湊和/或 tidyverse-idiomatic 的解決方案。 當數據管道的第一步是矩陣時,其他人會怎么做?

如果你不介意在你的管道中有一個 base R function,那么你可以這樣做:

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

當然,這只是基本 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

這些都給出與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

創建於 2023-01-24,使用reprex v2.0.2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM