【问题标题】:Emulating reshape2::melt with pivot_longer for matrixes为矩阵模拟 reshape2::melt 和 pivot_longer
【发布时间】:2020-06-12 10:08:51
【问题描述】:

我只是尝试在 2D 矩阵上使用 pivot_longer 来获取 ggplot 的“整洁”数据。到目前为止,reshape2::melt

library(tidyverse)
library(reshape2)

x <- c(1, 2, 3, 4)
y <- c(1, 2, 3)

Data      <- matrix(round(rnorm(12, 10, 4)), nrow = 4, ncol = 3)
melt_data <- reshape2::melt(Data)

ggplot2::ggplot(meltvec, ggplot2::aes(x = Var1, y = Var2, fill = value)) +
   geom_tile()

但是,pivot_longer 需要一个 tibble 或 data.frame。所以我想出了以下功能:

matrix_longer <- function(.data){
  stopifnot(is.matrix(.data),
            !is.data.frame(.data))

  .data <- as.data.frame(.data)
  names(.data) <- 1:ncol(.data)

  .data$Var1 =1:nrow(.data)

   pivot_longer(.data,cols = as.character( 1:(ncol(.data)-1)), names_to = "Var2", values_to = "value") %>% 
     arrange(Var2) %>% 
     mutate(Var2=as.numeric(Var2))
 }

它产生相同的输出

own_data <- matrix_longer(Data)

ggplot2::ggplot(own_data, ggplot2::aes(x = Var1, y = Var2, fill = value)) +
   geom_tile()

all(own_data==melt_data)

问题是:有没有更好的解决方案?我应该/我可以坚持reshape2::melt吗?使用.data 是不是一个坏主意?

【问题讨论】:

  • 有什么理由要从矩阵而不是 data.frame/tibble 开始?毕竟,小标题是 ggplot 提倡的格式。关于.data,我认为这取决于您是否使用rlang包中的.datarlang.r-lib.org/reference/tidyeval-data.html
  • 我从矩阵开始,因为这是我手头的格式。无论如何,我必须将其转换为 pivot_longer,所以我更愿意在一个函数调用中完成所有这些。

标签: r tidyverse tidyr melt


【解决方案1】:

要从矩阵中获取包含行和列索引和值的三列数据框,您只需使用as.data.frame.table()

set.seed(9)
Data <- matrix(round(rnorm(12, 10, 4)), nrow = 4, ncol = 3)

as.data.frame.table(Data, responseName = "value")

   Var1 Var2 value
1     A    A    10
2     B    A     9
3     C    A    17
4     D    A     7
5     A    B    10
6     B    B     0
7     C    B    14
8     D    B     7
9     A    C    17
10    B    C    11
11    C    C     9
12    D    C    14

如果您希望索引是整数而不是字母数字值(默认为因子),您可以这样做:

library(dplyr)

as.data.frame.table(Data, responseName = "value") %>%
  mutate_if(is.factor, as.integer)

   Var1 Var2 value
1     1    1    10
2     2    1     9
3     3    1    17
4     4    1     7
5     1    2    10
6     2    2     0
7     3    2    14
8     4    2     7
9     1    3    17
10    2    3    11
11    3    3     9
12    4    3    14

【讨论】:

    猜你喜欢
    • 2015-06-08
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 2018-05-08
    • 1970-01-01
    • 2016-07-27
    相关资源
    最近更新 更多