在R中使用for循环绘制多个直方图

4

我有一个包含如下数据的 .csv 文件:

         RI    Na   Mg   Al    Si    K    Ca   Ba   Fe Type
1   1.51793 12.79 3.50 1.12 73.03 0.64  8.77 0.00 0.00  BWF
2   1.51643 12.16 3.52 1.35 72.89 0.57  8.53 0.00 0.00  VWF
3   1.51793 13.21 3.48 1.41 72.64 0.59  8.43 0.00 0.00  BWF
4   1.51299 14.40 1.74 1.54 74.55 0.00  7.59 0.00 0.00  TBL
5   1.53393 12.30 0.00 1.00 70.16 0.12 16.19 0.00 0.24 BWNF
6   1.51655 12.75 2.85 1.44 73.27 0.57  8.79 0.11 0.22 BWNF

我想为每个列的分布创建直方图。我尝试了以下方法:

data<-read.csv("glass.csv")
names<-(attributes(data)$names)
for(name in names)
{
    dev.new()
    hist(data$name)
}

但我一直收到这个错误:Error in hist.default(data$name) : 'x' must be numeric 我认为这个错误是因为attributes(data)$names返回一组字符串,如下:"RI" "Na" "Mg" "Al" "Si" "K" "Ca" "Ba" "Fe" "Type" 但我无法将它们转换为所需的格式。
任何帮助都将不胜感激!
3个回答

6
你接近了答案。我认为你也试图在结尾处获取Type
data<-read.csv("glass.csv")
# names<-(attributes(data)$names)
names<-names(data)
classes<-sapply(data,class)

for(name in names[classes == 'numeric'])
{
    dev.new()
    hist(data[,name]) # subset with [] not $
}

您也可以直接循环遍历列:
for (column in data[class=='numeric']) {
    dev.new()
    hist(column)
}

但是ggplot2是设计用于多个图形的。试试这样做:
library(ggplot2)
library(reshape2)
ggplot(melt(data),aes(x=value)) + geom_histogram() + facet_wrap(~variable)

3

不要画很多直方图,更好的解决方案是在面板中绘制一个带有直方图的图形。

为此,您需要使用 reshape2ggplot2 包。

library(reshape2)
library(ggplot2)

首先,您需要将数据从宽格式转换为长格式。
long_data <- melt(data, id.vars = "Type", variable.name = "Element")

接下来使用 melt 函数创建一个 value 参数的 ggplot(你可以通过在上面的调用中传递 value.name = "whatever" 来更改其名称),并在每个面板中拆分每个元素的直方图。

(histograms <- ggplot(long_data, aes(value)) +
  geom_histogram() +
  facet_wrap(~ Element)
)

1

hist(data$name) 寻找一个名为 name 的列,但是这个列并不存在。请使用 hist(data[,name]) 代替。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接