【发布时间】: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包中的.data:rlang.r-lib.org/reference/tidyeval-data.html -
我从矩阵开始,因为这是我手头的格式。无论如何,我必须将其转换为 pivot_longer,所以我更愿意在一个函数调用中完成所有这些。