首页 > 解决方案 > 如何在R中重新生成直方图?

问题描述

PAC 对这篇文章的回答显示了如何将直方图数据从 R 导出到 CSV。

> x  <- rnorm(1000)
> h  <- hist(x)
> h
$breaks
[1] -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5  0.0  0.5  1.0  1.5  2.0  2.5  3.0  3.5  4.0

$counts
[1]   1   5  23  38 104 154 208 191 130  85  39  17   4   0   1

$density
[1] 0.002 0.010 0.046 0.076 0.208 0.308 0.416 0.382 0.260 0.170 0.078 0.034 0.008 0.000 0.002

$mids
[1] -3.25 -2.75 -2.25 -1.75 -1.25 -0.75 -0.25  0.25  0.75  1.25  1.75  2.25  2.75  3.25  3.75

$xname
[1] "x"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"
> out  <- data.frame(mid = h$mids, counts = h$counts)
> write.table(out, file = "export.csv", row.names = FALSE, sep = ",")

假设我使用上述方法将直方图的breaks, counts, density,值存储在 CSV 文件中。mids现在,如何在 RStudio 中加载 CSV 文件并从 CSV 文件值重新生成直方图。请告诉我。提前致谢。

标签: r

解决方案


好吧,如果您真的想将直方图编写为 csv,并且能够从该 csv 完全重构它,您可以。我自己可能会在这里使用其他方法之一,但看看它是如何完成的可能会很有用:

我们首先定义一个将直方图保存到 csv 的函数,首先将其放入数据帧中。我们必须填充所有直方图的数据成员,使它们具有相同的长度,但是当我们重新加载 csv 时,我们会很容易地逆转这一点:

# Save a histogram object to csv
hist2csv <- function(h, csv_path)
{
  df <-  data.frame(breaks = h$breaks,   counts = c(h$counts, 1),
                    density = c(h$density, 1), mids = c(h$mids, 1),
                    xname = rep(h$xname, length(h$breaks)), 
                    equidist = rep(T, length(h$breaks)))

  write.csv(df, csv_path)
}

加载函数只是反转这个过程并确保结果列表被归类为直方图:

# Load a histogram object from csv
csv2hist <- function(csv_path)
{
  df         <- read.csv(csv_path)
  h          <- as.list(df)
  h$counts   <- h$counts[-length(h$breaks)]
  h$density  <- h$density[-length(h$breaks)]
  h$mids     <- h$mids[-length(h$breaks)]
  h$xname    <- h$xname[1]
  h$equidist <- h$equidist[1]
  class(h)   <- "histogram"

  return(h)
}

所以现在你可以做

x  <- rnorm(1000)
h  <- hist(x)

# Save csv
hist2csv(h, "hist.csv")

# Load csv as histogram
new_h <- csv2hist("hist.csv") 

# Plot as normal
plot(new_h)

在此处输入图像描述


推荐阅读