gpt4 book ai didi

arrays - 如何用 tidyr 替换数组的 reshape2::melt?

转载 作者:行者123 更新时间:2023-12-03 21:22:40 26 4
gpt4 key购买 nike

我想将矩阵/数组(带有dimnames)转换为数据框。使用 reshape2::melt 可以很容易地做到这一点。但似乎更难使用 tidyr ,实际上在数组的情况下不太可能。我错过了什么吗? (特别是因为 reshape2 将自己描述为退休;参见 https://github.com/hadley/reshape )。

例如,给定以下矩阵

MyScores <- matrix(runif(2*3), nrow = 2, ncol = 3, 
dimnames = list(Month = month.name[1:2], Class = LETTERS[1:3]))

我们可以把它变成一个数据框,如下所示
reshape2::melt(MyScores, value.name = 'Score') # perfect

或者,使用 tidyr如下:
as_tibble(MyScores, rownames = 'Month') %>% 
gather(Class, Score, -Month)

在这种情况下 reshape2tidyr看起来很相似(尽管 reshape2 如果您正在寻找长格式数据框会更短)。

但是对于数组,似乎更难。给定的
EverybodyScores <- array(runif(2*3*5), dim = c(2,3,5), 
dimnames = list(Month = month.name[1:2], Class = LETTERS[1:3], StudentID = 1:5))

我们可以将其转换为数据框,如下所示:
reshape2::melt(EverybodyScores, value.name = 'Score') # perfect

但使用 tidyr目前尚不清楚如何做到这一点:
as_tibble(EverybodyScores, rownames = 'Month') # looses month information and need to distange Class and StudentID

在这种情况下,正确的解决方案是坚持使用 reshape2 ?

最佳答案

制作 tibble 会删除行名称,但不是直接进入 tibble,您可以将数组制作为基数 R data.frame ,然后使用 tidyr::rownames_to_column做一个专栏几个月。请注意,转换为数据框会创建名称类似于 A.1 的列。 , 将类和 ID 粘在一起;您可以再次使用 tidyr::separate 将它们分开.调用 as_tibble是可选的,只是为了如果你关心它是一个 tibble最后,也可以在您从行名称中创建一列后出现在工作流程中的任何点。

library(tidyverse)

EverybodyScores <- array(runif(2*3*5), dim = c(2,3,5),
dimnames = list(Month = month.name[1:2], Class = LETTERS[1:3], StudentID = 1:5))

EverybodyScores %>%
as.data.frame() %>%
rownames_to_column("Month") %>%
gather(key = class_id, value = value, -Month) %>%
separate(class_id, into = c("Class", "StudentID"), sep = "\\.") %>%
as_tibble()
#> # A tibble: 30 x 4
#> Month Class StudentID value
#> <chr> <chr> <chr> <dbl>
#> 1 January A 1 0.576
#> 2 February A 1 0.229
#> 3 January B 1 0.930
#> 4 February B 1 0.547
#> 5 January C 1 0.761
#> 6 February C 1 0.468
#> 7 January A 2 0.631
#> 8 February A 2 0.893
#> 9 January B 2 0.638
#> 10 February B 2 0.735
#> # ... with 20 more rows

创建于 2018-08-15 由 reprex package (v0.2.0)。

关于arrays - 如何用 tidyr 替换数组的 reshape2::melt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51866344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com