[英]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))
的元素。
我最初在這里有一個有點笨拙的解決方案,但意識到它沒有用。 我認為所需的步驟是
tibble::rownames_to_column("tmp")
)pivot_longer()
和-tmp
並將names_to
設置為列維度名稱 這似乎比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.