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

Ran*_*ser 4 statistics r histogram data-analysis

我有一个 .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
Run Code Online (Sandbox Code Playgroud)

我想为每一列的分布创建直方图。我试过这个:

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

但我不断收到此错误: Error in hist.default(data$name) : 'x' must be numeric

我假设这个错误是因为attributes(data)$names返回了一组字符串,"RI" "Na" "Mg" "Al" "Si" "K" "Ca" "Ba" "Fe" "Type"

但我无法将它们转换为必要的格式。

任何帮助表示赞赏!

nog*_*pes 5

你很接近。我想你也试图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 $
}
Run Code Online (Sandbox Code Playgroud)

您也可以直接遍历列:

for (column in data[class=='numeric']) {
    dev.new()
    hist(column)
}
Run Code Online (Sandbox Code Playgroud)

但是ggplot2是为多个地块设计的。像这样尝试:

library(ggplot2)
library(reshape2)
ggplot(melt(data),aes(x=value)) + geom_histogram() + facet_wrap(~variable)
Run Code Online (Sandbox Code Playgroud)